Rails 4:Parent has_one具有特定相关ChildType的Child

时间:2014-10-16 18:11:14

标签: ruby-on-rails-4 rails-activerecord has-one scopes

我的Parent有很多Children,但只有一个FirstbornFirstbornChild,其中ChildType为"长子"。

class Parent
  has_many :children
  has_one :firstborn, -> { includes(:child_type).references(:child_type).where("child_type.name = ?", "firstborn") }, class_name: "Child"
end

class Child
  belongs_to :parent
  belongs_to :child_type
end

class ChildType
  has_many :children
end

以下代码执行

parent = Parent.find(1)      # => <parent object>
firstborn = parent.firstborn # => nil

最终目标是能够在1个查询中检索所有父母和长子。

parents_and_firstborn = Parent.includes(:firstborn)

我正在寻找一个只执行1个查询的解决方案,并检索Parent和相关Firstborn个孩子。

我已经查看了有关has_one的Rails 4.0.2 API文档,但没有一个例子 跨越多个表格,就像我试图做的那样。

更新时间:2014-10-16 14:40

以下&#34;工作&#34;但我不知道为什么:

parent = Parent.includes(:firstborn).find(1) # => <parent with firstborn>

为什么我在检索到firstborn之后无法检索Parent,但如果我在原始查询中includes(...)它会返回它?

解决方案:2014-10-16 14:50

我在attr_accessor :firstborn模型中仍然遇到Parent模型以解决此问题。当我删除那些未使用的代码时,has_one :firstborn ...代码按预期工作。

1 个答案:

答案 0 :(得分:1)

看起来是正确的(ish),你应该调试正在执行的SQL。

我实际上从我在这里看到的问题来质疑ChildType表的优点。架构看起来过于复杂。为什么不使用first_born bool?