Ruby on rails 3 “了解Rails ActiveRecord”;“单一型号”;自连接
我很难理解如何在Rails中实现单个模型的自连接。 简单地解释了自联接,但没有提供足够的信息,关于这类联接的每个示例或帖子都引用了友好的Friend Railcast示例,该示例不是单一模型自联接,如中所述 这个想法是一个模型,它有很多并且属于它自己,而不需要一个单独的关系表。我认为需要一个单独的表的唯一原因是,如果您希望关系包含比关系更多的信息。e、 g.“最好的朋友”,“几乎不认识他们” 我有一个简单的Post模式:Ruby on rails 3 “了解Rails ActiveRecord”;“单一型号”;自连接,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,我很难理解如何在Rails中实现单个模型的自连接。 简单地解释了自联接,但没有提供足够的信息,关于这类联接的每个示例或帖子都引用了友好的Friend Railcast示例,该示例不是单一模型自联接,如中所述 这个想法是一个模型,它有很多并且属于它自己,而不需要一个单独的关系表。我认为需要一个单独的表的唯一原因是,如果您希望关系包含比关系更多的信息。e、 g.“最好的朋友”,“几乎不认识他们” 我有一个简单的Post模式: create_table "posts", :force => tr
create_table "posts", :force => true do |t|
t.datetime "posted"
t.string "nick"
t.string "title"
t.text "content"
t.integer "parent_post_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
父帖子id是对其他帖子id的自引用。posts.rb模型定义了以下关系:
class Post < ActiveRecord::Base
has_many :replies, :class_name => "Post"
belongs_to :parent_post, :class_name => "Post",
:foreign_key => "parent_post_id"
end
class Post < ActiveRecord::Base
has_many :replies, :class_name => "Post",
:foreign_key => "parent_post_id"
belongs_to :parent_post, :class_name => "Post",
:foreign_key => "parent_post_id"
end
或查找帖子的父项:
@parent_post = post.parent_post
这可能都是一些语法错误理解。所以,提前感谢任何能给我一些感觉的人。我浏览了所有SO和博客文章,没有人尝试过指南中描述的单模型自引用自连接方法
任何人如果提供的解释没有指向使用单独关系表的Friendly Friend示例,我将获得积分。我缺少“parent\u post\u id”的has\u many外键。设置后,post.reply将按父项post\u id引用其他post实例 posts.rb模型定义了以下关系:
class Post < ActiveRecord::Base
has_many :replies, :class_name => "Post"
belongs_to :parent_post, :class_name => "Post",
:foreign_key => "parent_post_id"
end
class Post < ActiveRecord::Base
has_many :replies, :class_name => "Post",
:foreign_key => "parent_post_id"
belongs_to :parent_post, :class_name => "Post",
:foreign_key => "parent_post_id"
end
class Post“Post”,
:foreign\u key=>parent\u post\u id
属于:父项发布,:类发布名称=>“发布”,
:foreign\u key=>parent\u post\u id
结束
我现在可以创建帖子,为不同的帖子分配一个父帖子id,然后再获取所有回复任何父帖子的帖子。如果您按照预期的方式描述发生了什么/没有发生什么,那么就更容易开始了。另外,像
按树行事
这样的东西是单表、单模型自参考的——你考虑过这样的东西吗?我想我考虑过。我希望能够调用post.repress并获得一组基于父post的post实例,由它的父post\u id=post\u id填充。这就解释了您的操作。不是发生了什么事,很抱歉。post.responses抛出了一个SQL错误。见下面我的答案。这个错误是一个SQL错误,最终让我明白了问题所在。post.replies正在生成SQL,其中:replies字段键默认为post\u id。而不是我想要的父项\u post\u id。一旦我将:foreign_key添加到:repress,now post.repress将查询使用父_post_id的帖子。