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