has_one:通过关联错误地返回nil表示new_record

时间:2016-02-05 14:12:09

标签: ruby-on-rails model-associations has-one-through

我有以下型号。是的,设计有点复杂,因为我们正在分阶段改造我们的架构;尽管如此,我认为这里的原则应该有效:

class Translation < ActiveRecord::Base
  belongs_to :translation_service_option
  belongs_to :service, inverse_of: :translation, class_name: "TranslationService"
  # I have also tried belongs_to :translation_service, inverse_of: :translation, foreign_key: :service_id
end

class TranslationService < Service
  # Service < ActiveRecord::Base
  has_one :translation, inverse_of: :service
  # I have also tried inverse_of: :translation_service in conjunction with above
  has_one :translation_service_option, through: :translation
end

我正在尝试在需要访问translation_service_option的TranslationService上构建一个before_save回调,但是,对于新记录,这将返回nil:

t = Translation.last
#=> #<Translation id: 154, translation_service_option_id: 5, [...]
t.service = TranslationService.new
#=> #<TranslationService id: nil [...]
t.translation_service_option
#=> #<TranslationServiceOption id: 5 [...]
t.service.translation_service_option
#=> nil
t.service.translation
#=> #<Translation id: 154 [...]
t.service.translation.translation_service_option
#=> #<TranslationServiceOption id: 5

当然,一旦我保存了对象,它工作正常,但问题是我需要在before_save(或before_create)回调中访问它:

t.service.save
t.translation_service_option
#=> #<TranslationServiceOption [...]

问题是t.service为其translation_service_option返回nil,即使t.service.translation有效translation_service_option

我认为t.service还没有ID, 知道它的translation对象。那么为什么它也不能知道它的translation_service_option对象呢?显然我可以在我的回调中使用self.translation.try(:translation_service_option),但由于回调使用的方法更普遍,因此开始变得混乱,因此只针对这一个怪癖,我发现自己需要替换{{1的所有用法与translation_service_option一起使用,这看起来似乎太过不正确,并且首先否定了设置translation.try(:translation_service_option)关联的目的。

有没有办法设置我的关联以在初始化时正确分配has_one :through

0 个答案:

没有答案