Rails 4使用Proc.new,条件在活动记录关联中

时间:2014-01-06 15:14:54

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

当项目使用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'

1 个答案:

答案 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