如何在 JRuby w/ActiveRecord 中创建多对多 class 实例关系?

How do you create many-to-many class instance relationships in JRuby w/ActiveRecord?

我有这个基本设置:

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.barsBar.first.foos 查看与 foos 关联的所有条,这按预期工作。

让我难过的是如何做这样的事情:

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"

如何实现所需的行为?

您的 bar_rowsfoo_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 的表现是一样的。