ActiveRecord :inverse_of не работает с has_many :through в модели соединения при создании

Я не могу заставить inverse_of работать над моделями объединения при создании. Я не уверен, является ли это ошибкой или просто не реализовано как таковое. У меня есть следующие модели:

class Challenge < ActiveRecord::Base
  has_many :groups, :through => :group_challenges
  has_many :group_challenges, :inverse_of => :challenge

  attr_accessor :contact_ids
end

class GroupChallenge < ActiveRecord::Base
  belongs_to :challenge, :inverse_of => :group_challenges
  belongs_to :group, :inverse_of => :group_challenges

  before_save :check_challenge

  def check_challenge
    Rails.logger.debug("challenge.contact_ids: #{challenge.contact_ids}")
  end
end

class Group < ActiveRecord::Base
  has_many :challenges, :through => :group_challenges
  has_many :group_challenges, :inverse_of => :group
end

contact_ids — это виртуальный атрибут моего challenge, и я хотел бы получить к ним доступ в модели group_challenges при создании этой ассоциации. Я не могу заставить его работать. Вот пример:

challenge = Challenge.new :groups => Group.all, :contact_ids => [1,2,3]
# log output => challenge.contact_ids: []

Однако inverse_of работает при перезагрузке моделей.

challenge.reload
challenge.group_challenges.first.challenge.contact_ids
# log output => challenge.contact_ids: [1,2,3]

Кто-нибудь знает, является ли это просто ограничением конструкции inverse_of или, скорее, ошибкой в ​​реализации?


person brad    schedule 15.09.2011    source источник
comment
У меня та же проблема.   -  person rafamvc    schedule 04.10.2011


Ответы (1)


Согласно api активной записи 3.2.1: "В настоящее время :inverse_of поддерживает has_one и has_many (но не ассоциации :through варианты). Он также предоставляет обратную поддержку для ассоциаций принадлежности_к, где обратным является has_one, а не полиморфный».

person Liana    schedule 14.03.2012
comment
о, хорошо, я никогда не замечал эту документацию. А жаль, это было бы так удобно!! - person brad; 15.03.2012