Rails关联-has_many=>:通过-但相同的模型

我想做的是:

我有一个博客,想在主帖子下面显示相关帖子

课后<ActiveRecord::Base
有很多相关的帖子
有许多:帖子,:通过=>:相关职位
终止

然后在联接模型/表中

类相关post<ActiveRecord::Base
属于:职位
终止

当然,还有一个名为related\u posts的表,其中有两列post\u id

很明显,这有几个缺陷,我只是不知道如何让这个关联在Rails中工作

这是一个有趣的问题

我刚刚为您的用例创建了一个可用的应用程序

post.related_posts将为您提供所有与post相关的post,而post.reverse_related_posts将为您提供所有与post相关的post

以下是我的模型的外观:

课后<ActiveRecord::Base
拥有多个:相关的\u帖子\u关联,:class\u name=>“相关职位”
有很多:相关的帖子,:至=>:相关帖子关联:source=>:相关职位
有很多:反向相关的帖子关联,:class\u name=>“RelatedPost”,:外键=>“相关职位id”
有很多:反向相关的帖子,:通过=>:反向相关帖子关联:source=>:邮递
终止
班级相关职位<ActiveRecord::Base
属于:职位
属于:相关职位,类别名称=>“职位”
终止

我的模式:

ActiveRecord::Schema.define(:version=>20110702194300)do
创建表格“posts”,:force=>真的吗|
t、 字符串“name”
t、 日期时间“创建时间”
t、 日期时间“更新时间”
终止
创建表格“相关帖子”:force=>真的吗|
t、 整数“post_id”
t、 整数“相关职位id”
t、 日期时间“创建时间”
t、 日期时间“更新时间”
终止
终止

下面是一个控制台会话的转储,演示了这种关系

ruby-1.9.2-p180:001:0&gt&燃气轮机;p=Post.create!姓名:“你好”
SQL(23.5ms)插入“posts”(“created_at”,“name”,“updated_at”)值(?,,?)[[“created_at”,Sat,2011年7月2日20:03:43 UTC+00:00],“name”,“Hello”],[“updated_at”,Sat,2011年7月2日20:03:43 UTC+00:00]]
#=&gt#&书信电报;帖子id:1,名称:“你好”,创建于:“2011-07-02 20:03:43”,更新于:“2011-07-02 20:03:43”>
ruby-1.9.2-p180:002:0&gt&燃气轮机;p2=Post.create!名称:“世界”
SQL(1.0ms)插入“posts”(“创建时间”、“名称”、“更新时间”)值(?,?)[[“创建时间”,2011年7月2日星期六20:03:48 UTC+00:00],“名称”、“世界”],[“更新时间”,2011年7月2日星期六20:03:48 UTC+00:00]]
#=&gt#&书信电报;帖子id:2,名称:“世界”,创建于:“2011-07-02 20:03:48”,更新于:“2011-07-02 20:03:48”>
ruby-1.9.2-p180:003:0&gt&燃气轮机;p、 相关职位
Post Load(0.2ms)选择“posts”。*从“posts”内部连接到“posts”上的“related_posts”。“id”=“related_posts”。“related_Post_id”其中的“related_posts”。“Post_id”=1
#=>[]
ruby-1.9.2-p180:004:0&gt&燃气轮机;p2.1相关职位
Post Load(0.4ms)选择“posts”。*从“posts”内部连接到“posts”上的“related_posts”。“id”=“related_posts”。“related_Post_id”其中的“related_posts”。“Post_id”=2
#=>[]
ruby-1.9.2-p180:005:0&gt&燃气轮机;p、 相关职位&lt&书信电报;p2
SQL(0.7ms)插入“相关帖子”(“已创建”、“帖子id”、“相关帖子id”、“更新帖子id”)值(?、、?、?)[[“已创建帖子”,Sat,2011年7月2日20:04:01 UTC+00:00],“帖子id”,1],“相关帖子id”,2],“更新帖子”,Sat,2011年7月2日20:04:01 UTC+00:00]]
#=>[#<帖子id:2,名称:“世界”,创建于:“2011-07-02 20:03:48”,更新于:“2011-07-02 20:03:48”>]
ruby-1.9.2-p180:006:0&gt&燃气轮机;相关职位
相关帖子加载(0.4ms)从“相关帖子”中选择“相关帖子”。*
#=>[#<相关帖子id:1,帖子id:1,相关帖子id:2,创建于:“2011-07-02 20:04:01”,更新于:“2011-07-02 20:04:01”>]
ruby-1.9.2-p180:007:0&gt&燃气轮机;p2.与职位相关的职位
Post Load(0.2ms)选择“posts”。*从“posts”内部连接到“posts”上的“related_posts”。“id”=“related_posts”。“Post_id”中的“related_posts”。“related_Post_id”=2
#=>[#<帖子id:1,名称:“你好”,创建地址:“2011-07-02 20:03:43”,更新地址:“2011-07-02 20:03:43”>]
ruby-1.9.2-p180:008:0&gt&燃气轮机;p=邮政优先
后加载(0.5ms)选择“立柱”。*从“立柱”限制1
#=&gt#&书信电报;帖子id:1,名称:“你好”,创建于:“2011-07-02 20:03:43”,更新于:“2011-07-02 20:03:43”>
ruby-1.9.2-p180:009:0&gt&燃气轮机;p2.相关职位&lt&书信电报;P
SQL(25.7ms)插入“相关帖子”(“创建时间”、“帖子id”、“相关帖子id”、“更新时间”)值(?、、?、?)[[“创建时间”,Sat,2011年7月2日20:05:29 UTC+00:00],“帖子id”,2],“相关帖子id”,1],“更新时间”,Sat,2011年7月2日20:05:29 UTC+00:00]]
帖子加载(0.3ms)选择“帖子”。*从“帖子”内部连接“帖子”上的“相关帖子”。“id”=“相关帖子”。“相关帖子id”中的“相关帖子”。“帖子id”=2
#=>[#<帖子id:1,名称:“你好”,创建地址:“2011-07-02 20:03:43”,更新地址:“2011-07-02 20:03:43”>]
ruby-1.9.2-p180:010:0&gt&燃气轮机;p2.1相关职位
#=>[#<帖子id:1,名称:“你好”,创建地址:“2011-07-02 20:03:43”,更新地址:“2011-07-02 20:03:43”>]
ruby-1.9.2-p180:011:0&gt&燃气轮机;出口
加载开发环境(Rails 3.1.0.rc4)
ruby-1.9.2-p180:001:0&gt&燃气轮机;Post.first.related_posts
后加载(0.3ms)选择“立柱”。*从“立柱”限制1
Post Load(0.2ms)选择“posts”。*从“posts”内部连接到“posts”上的“related_posts”。“id”=“related_posts”。“related_Post_id”其中的“related_posts”。“Post_id”=1
#=>[#<帖子id:2,名称:“世界”,创建于:“2011-07-02 20:03:48”,更新于:“2011-07-02 20:03:48”>]
ruby-1.9.2-p180:002:0&gt&燃气轮机;Post.last.related_posts
加载后(0.2ms)选择“posts”。*从“posts”中按“posts”排序。“id”DESC LIMIT 1
Post Load(0.2ms)选择“posts”。*从“posts”内部连接到“posts”上的“related_posts”。“id”=“related_posts”。“related_Post_id”其中的“related_posts”。“Post_id”=2
#=>[#<帖子id:1,名称:“你好”,创建地址:“2011-07-02 20:03:43”,更新地址:“2011-07-02 20:03:43”>]

发表评论