我有以下基本设置:
class Foo < ActiveRecord::Base
self.primary_key = 'foo_id'
has_and_belongs_to_many :bars
end
class Bar < ActiveRecord::Base
self.primary_key = :bar_id
has_and_belongs_to_many :foos
end
现在,我可以使用Foo.first.bars
或Bar.first.foos
来查看与foo相关的所有条形,并且按预期运行。
我感到难过的是如何执行以下操作:
foo_rows = Foo.all
=> (all those rows)
bar_rows = Bar.all
=> (all those rows)
foo_rows.first.bars.find { |bar| bar.bar_id == 1 }.some_col
=> "The value from the database"
bar_rows.find { |bar| bar.bar_id == 1 }.some_col = 'a new value'
=> "a new value"
foo_rows.first.bars.find { |bar| bar.bar_id == 1 }.some_col
=> "a new value"
但是最后一行说"The value from the database"
如何实现所需的行为?
答案 0 :(得分:0)
您的bar_rows
和foo_rows.first.bars
是内存中具有不同对象的数组。只是因为其中一个元素的id
属性相等,并不意味着它们是相同的对象:
bar_rows.find { |bar| bar.bar_id == 1 }.object_id
# => 40057500
foo_rows.first.bars.find { |bar| bar.bar_id == 1 }.object_id
# => 40057123
您正在更改这些对象之一的属性,没有理由应该更改第二个对象的属性。
对于JRuby
部分来说,没关系-MRI的行为相同。