2

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

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返回 nil translation_service_option,即使t.service.translation有一个有效的translation_service_option.

我知道它还没有t.serviceid,它确实知道它的translation对象。那么为什么它不能也知道它的translation_service_option对象呢?显然我可以self.translation.try(:translation_service_option)在我的回调中使用,但是随着回调使用更普遍使用的方法,这开始变得混乱,所以只是为了这个怪癖,我发现自己需要替换所有使用translation_service_optionwith translation.try(:translation_service_option),这似乎太不合适了Railsy 一开始就否定了成立has_one :through协会的目的。

有没有办法可以设置我的关联以t.service.translation_service_option在初始化时正确分配?

4

0 回答 0