Ruby on rails has_one:through association错误地为新的_记录返回nil

Ruby on rails has_one:through association错误地为新的_记录返回nil,ruby-on-rails,model-associations,has-one-through,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

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

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
类翻译
我正在尝试在TranslationService上构建需要访问translation\u service\u选项的before\u 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
t=Translation.last
#=>零
t、 服务翻译

#我认为你做不到
ActiveRecord::Base
对于
有一个
方法是必需的,您不是从
Translate
继承的,而是从
服务
继承的,这里没有提到。服务继承自
ActiveRecord::Base
,我添加了一条注释来澄清这一点。模型在保存时工作正常,唯一的问题是当它们是新记录时,
有一个:through
关联返回nil。你说得对,设计是复杂的。不,我不相信你能做这个查询,因为关系中的倒数没有被持久化。我会考虑如果你真的需要使用一个模型回调-你可能只是建立一些非常紧密和混乱的耦合周围一些可怜的架构选择。请原谅卷积,但有很多的要求,从业务方面,这意味着我不能一个整体地改造一个不幸的不幸。在任何情况下,唯一没有被持久化的关系是Rails已经知道如何处理的关系:
TranslationService
没有被持久化,但是可以访问它的
translation
,而
translation
可以访问它的
translation\u服务选项(被持久化)。我当时不明白的是,
TranslationService
为什么可以查找它的
translation
而不是
translation\u service\u选项
?因为我需要它来进行回填,这至少是可行的,尽管我不会接受它作为将来创建TranslationService对象的所有调用的永久解决方案:
t.service=TranslationService.new(translation\u service\u选项:t.translation\u service\u选项)
t.service.save
t.translation_service_option
#=> #<TranslationServiceOption [...]