【问题标题】:Rails 4 using Proc.new with conditions inside active record associationRails 4 使用 Proc.new 与活动记录关联中的条件
【发布时间】:2014-01-24 00:53:40
【问题描述】:

我在项目使用 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 而又不失去检查组织 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'

【问题讨论】:

  • 你能发布确切的警告信息吗?
  • 肯定在问题的最后贴出来。

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


【解决方案1】:

试试这个,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多