Как вы создаете связи экземпляров класса многие-ко-многим в JRuby с ActiveRecord? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть базовая настройка:

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 Ответ

0 голосов
/ 22 ноября 2018

Ваши 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, это не имеет значения - МРТ будет вести себя так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...