我正在研究两种轨道模型的关联:用户和帖子
我在用户和帖子之间有一个has_many关联以及belongs_to的反向关系。
我还想在User和Post之间建立一个has_one关联,但是在这个关联中,我不想要Post到User的外键。
例如
class User < ActiveRecord::Base
has_many :posts
has_one :current_post
end
class Post < ActiveRecord::Base
belongs_to :user
end
所以has_many:posts在Post上有一个user_id的foreign_key,但我不希望current_post也有这种反向关系。有没有办法做到这一点(例如has_one:current_post,:foreign_key =&gt; false)?
答案 0 :(得分:1)
看起来你对这种关系有了倒退的想法。外键实际上是创建关联的 - 没有它,没有任何关联。将外键视为指向父对象的指针或地址。任何特定的子节点都与父节点关联,因为它存储父节点的外键。要搜索父级的子级,您需要在已指定父级&#34; has_one&#34;的类型的子对象中查找父级的主键。或&#34; has_many&#34;的。如果你刚刚拥有&#34; has_many&#34;并且没有外键,将创建零关系,因为没有特定对象实际上指向任何其他对象。
如果你真的想要,你可以做的是拥有belongs_to而没有has_one或has_many。如果这样做,您将能够从子项开始查找父对象,因为子项将具有指向父项的指针。但是你发现更难找出父母有哪些子对象,因为你没有告诉ActiveRecord父模型应该有孩子。
在您的示例中,User has_many posts
和Post belongs_to user
没问题。但是当你说User has_one current_post
时,你要告诉ActiveRecord寻找一个不存在的密钥。
解决问题的一种方法可能是始终与用户一起存储最新帖子的外键。说User belongs_to current_post
听起来反直觉,但它完成了我认为你想要它做的事情。
也就是说,将密钥存储到当前或最新的帖子可能根本不需要。使用ActiveRecord生成的任何模型自动创建时间戳,因此您可以获取具有最新时间戳的帖子,如果这是您正在寻找的所有内容。