当Rails以反向方式加载其依赖模型时,所有has_one
和belongs_to
关系都有一个非常有趣的情况。
让我们建立一个模型Couple
,其中包含同一类的两个相关模型,User
:
class Couple < ActiveRecord::Base
has_one :male, class_name: "User"
has_one :female, class_name: "User"
end
class User < ActiveRecord::Base
belongs_to :couple
end
在这种情况下,当我们创建Couple
并为其分配两个User
实例时,我们将进入此处:
# create all the stuff
couple = Couple.new
he = User.create name: 'Bob'
she = User.create name: 'Sara'
couple.male = he
couple.female = she
couple.save
# here's where the gap begins:
couple.male.name # => 'Bob'
couple.female.name # => 'Sara'
# Ok, so far so good...
Couple.find(couple.id).male.name # => 'Bob'
# What's the ..?!
Couple.find(couple.id).female.name # => 'Bob'
我在控制台中看到的所有这些内容是:
> couple.female.name
'Sara'
# nothing happens as the model is loaded already
> Couple.find(couple.id).female.name
SELECT `couples`.* FROM `couples` WHERE `couples`.`id` = 2 LIMIT 1
SELECT `users`.* FROM `users` WHERE `users`.`couple_id` = 2 LIMIT 1
'Bob'
# sure, here's the trouble!
嗯......那不好......通过互联网搜索引导我这样做:我创建了两个类MaleUser
和FemaleUser
,两个类都来自{{1}模型。并将User
更改为belongs_to :couple
和belongs_to :couple, foreign_key: :his_id
。然而,我在屏幕上看到的结果相同。
我的问题是,为什么会发生这种情况以及如何以正确的方式执行加载?那么... :her_id
会给我一个合适的对象吗?
UPD:表格结构:
Couple.find(couple_id).she
谢谢!
答案 0 :(得分:0)
users
中Couple
的关系需要是belongs_to
关系,而不是has_one
。 E.g:
class Couple < ActiveRecord::Base
# ...
belongs_to :male, :class_name => 'User', :foreign_key => 'his_id'
belongs_to :female, :class_name => 'User', :foreign_key => 'her_id'
end
这告诉ActiveRecord Couple
有两个User
对象关系。一个名为male
,可以使用在情侣表的his_id
列中找到的ID进行检索,并在female
中找到一个名为her_id
的ID的has_one
列。
Users
会在couple_id
表(不存在)上查找此关系数据。 users表仅引用Couple
,而不是{{1}}关系的用户是男性还是女性用户。