do has_many:通过关联为仅存在于内存中的模型工作吗?

时间:2010-10-01 20:04:31

标签: ruby-on-rails activerecord associations

class A < ActiveRecord::Base
  has_many :bs
  has_many :cs, :through => :bs
end

class B < ActiveRecord::Base
  belongs_to :a
  belongs_to :c
end

class C < ActiveRecord::Base
  has_many :bs
end

如果我打开一个rails控制台,那么

a = A.new
b = a.bs.build
b.c = C.new

然后我得到

a.cs => []

a.bs[0].c => c

如果a已保存,则一切正常。这是预期的吗?当模型只存在于内存中时,为什么通关联不起作用?感谢

2 个答案:

答案 0 :(得分:2)

我猜对象a没有引用创建的对象c。通常它会运行查询,但不会因为它没有保存到db。我认为它是为db关系创建的,它只是不检查对内存中对象的引用。

你也可以试试这个:

a = A.new
a.cs.build
a.bs
=> []

a.cs
=> [created c object]

答案 1 :(得分:1)

以下是我如何解决这个问题的方法:

class A < ActiveRecord::Base
  has_many :bs

  def cs
    bs.map &:c
  end

end

你可能会失去一些东西。例如,cs现在是只读的,因此您无法为其分配或buildcreate。在我的特殊情况下这很好,因为我总是只会改变bs,这可能是一种更好的做法。此外,像B这样的多对多对象通常会有一些您想要设置的属性。

顺便说一下,如果CB加到has_many而不是belongs_to,则将上述代码更改为使用flat_map而不是{{1} }}