Как создать отношения экземпляров класса многие ко многим в JRuby с 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
Теперь я вижу все бары, связанные с foos, используя Foo.first.bars
или же Bar.first.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"
Как мне добиться желаемого поведения?
1 ответ
Решение
Ваш 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
часть, это не имеет значения - МРТ будет вести себя так же.