的
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已保存,则一切正常。这是预期的吗?当模型只存在于内存中时,为什么通关联不起作用?感谢
答案 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
现在是只读的,因此您无法为其分配或build
或create
。在我的特殊情况下这很好,因为我总是只会改变bs
,这可能是一种更好的做法。此外,像B
这样的多对多对象通常会有一些您想要设置的属性。
顺便说一下,如果C
被B
加到has_many
而不是belongs_to
,则将上述代码更改为使用flat_map
而不是{{1} }}