多个has_one属于同一个类

时间:2014-12-02 00:02:20

标签: ruby-on-rails ruby-on-rails-4 activerecord relationship

当Rails以反向方式加载其依赖模型时,所有has_onebelongs_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!

嗯......那不好......通过互联网搜索引导我这样做:我创建了两个类MaleUserFemaleUser,两个类都来自{{1}模型。并将User更改为belongs_to :couplebelongs_to :couple, foreign_key: :his_id。然而,我在屏幕上看到的结果相同。

我的问题是,为什么会发生这种情况以及如何以正确的方式执行加载?那么... :her_id会给我一个合适的对象吗?

UPD:表格结构:

Couple.find(couple_id).she

谢谢!

1 个答案:

答案 0 :(得分:0)

usersCouple的关系需要是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}}关系的用户是男性还是女性用户。