当项目使用Rails 3时,我创建了这个关联。因为我们已经升级到Rails 4,现在我收到了关于此的弃用警告。以下代码是Rails 4所说的不赞成的示例。
has_one :original_participant,
:through => :original_participation,
:source => :participants,
:conditions => Proc.new {
unless self.respond_to?(:organization_id)
"original_participants_surveys_participants.organization_id = surveys_participants.organization_id"
else
"surveys_participants.organization_id = #{self.organization_id}"
end
}
代码在条件块中具有除条件的原因是由于sphinx。当sphinx构建它的索引时,它不会有organization_id可用。使用标准的Active Record调用时,它将具有organization_id。因此,我需要在它完成时才进行此工作,并且没有定义organization_id。我已经对此做了一些研究,到目前为止还没有提出任何解决方案来实现Rails 4方式。这在Rails 4中仍然可以正常工作,但我再次收到弃用警告。
很长的问题简介如何将此转换为Rails 4兼容而不会失去检查organization_id是否可用的功能?
这是rails给我的实际警告信息
弃用警告:不推荐使用Surveys :: Participant.has_one:original_participant声明中的以下选项::conditions。请改用示波器块。例如,以下内容:
has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment'
应改写如下:
has_many :spam_comments, -> { where spam: true }, class_name: 'Comment'
答案 0 :(得分:2)
试试这个,
has_one :original_participant,
->(record) {
unless record.respond_to?(:organization_id)
where("original_participants_surveys_participants.organization_id = surveys_participants.organization_id")
else
where("surveys_participants.organization_id = #{record.organization_id}")
end
},
:through => :original_participation,
:source => :participants