我有以下型号。是的,设计有点复杂,因为我们正在分阶段改造我们的架构;尽管如此,我认为这里的原则应该有效:
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.service
id,它确实知道它的translation
对象。那么为什么它不能也知道它的translation_service_option
对象呢?显然我可以self.translation.try(:translation_service_option)
在我的回调中使用,但是随着回调使用更普遍使用的方法,这开始变得混乱,所以只是为了这个怪癖,我发现自己需要替换所有使用translation_service_option
with translation.try(:translation_service_option)
,这似乎太不合适了Railsy 一开始就否定了成立has_one :through
协会的目的。
有没有办法可以设置我的关联以t.service.translation_service_option
在初始化时正确分配?