Работает ли has_many: через ассоциации для моделей, которые существуют только в памяти? - PullRequest
2 голосов
/ 02 октября 2010

для

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

Если я поднимаю консоль рельсов и выполняю

a = A.new
b = a.bs.build
b.c = C.new

Тогда я получаю

a.cs => []

но

a.bs[0].c => c

Если a сохранено, то все работает.Это ожидается?почему сквозная ассоциация не работает, когда модели существуют только в памяти?спасибо

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

Я думаю, что объект a не имеет ссылки на созданный объект c. Обычно он запускает запрос, но не будет, поскольку он не сохраняется в БД. Я думаю, что он создан для отношений с БД и просто не проверяет ссылки на объекты в памяти.

Вы также можете попробовать это:

a = A.new
a.cs.build
a.bs
=> []

но

a.cs
=> [created c object]
1 голос
/ 22 января 2015

Вот как я обошел это:

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 вместо map.

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