【问题标题】:next method (Class.first) doesn't work after Rails update 4.1.0在 Rails 更新 4.1.0 后,下一个方法(Class.first)不起作用
【发布时间】:2014-04-30 15:15:56
【问题描述】:

我有一个看起来像这样的模型:

class Question < ActiveRecord::Base
  belongs_to :level

    def next
        Question.first(:conditions => ['id > ? AND level_id = ?', self.id, self.level_id], :order => 'id ASC') 
    end

end

这工作得很好,直到我被 rails 更新到 4.1.0 版。 现在我收到此错误:

QuestionsController#answer 中的 ArgumentError 值无效 整数(): "{:conditions=>[\"id > ? AND level_id = ?\""

我不知道如何解决这个问题。 Rails 更新可能是造成这个问题的原因吗?我在另一个应用程序中使用了完全相同的方法,并且该方法仍然有效。

【问题讨论】:

  • 你怎么调用这个函数???

标签: ruby-on-rails ruby ruby-on-rails-4 where argument-error


【解决方案1】:

方法 first 在 Rails 4 中发生了变化。

直到 Rails 3.2,它可以接受条件参数,并且您的实现可以工作。这是original documentation,注意它是如何在使用*args 之前检查它们的类型的。

在 Rails 4 中,方法发生了变化 (docs),现在它只接受整数限制。

你应该更新你的实现:

def next
  Question.where('id > ? AND level_id = ?', id, level_id).order(id: :asc).first 
end

【讨论】:

    【解决方案2】:

    试试这个:这应该可以工作

    Question.where("id > ? AND level_id = ?", id, level_id).order("id asc").first
    

    【讨论】:

    • 不幸的是,这不起作用,它引发了以下错误:ActiveRecord::StatementInvalid in QuestionsController#answer SQLite3::SQLException: unrecognized token: "'id > 1 AND level_id = 1) ORDER BY id asc LIMIT 1": SELECT "questions".* FROM "questions" WHERE ('id > 1 AND level_id = 1) ORDER BY id asc LIMIT 1
    • 很奇怪。您可以在控制台中尝试一下,并将输出添加到您的问题中吗?
    • 另外,再次在控制台中,尝试在 SQL 语句中使用硬编码值:where("id &gt; 1 AND level_id = 1")
    【解决方案3】:

    试试改成

    Question.where('id > ? AND level_id = ?', self.id, self.level_id).order(id: :asc).first
    

    【讨论】:

      【解决方案4】:

      documentation 开始,first 方法采用整数,而不是字符串。

      我也不记得它曾经接受过字符串,因为方法描述表明它返回前 N 条记录。也许在您进行更新并进行其他一些更改之前,从未调用过该特定方法。

      您可以使用where 方法,它接受您的条件,然后使用first 获得第一个结果。

      Question.where(:conditions => ['id > ? AND level_id = ?', self.id, self.level_id], :order => 'id ASC').first
      

      【讨论】:

      • 非常感谢!这很有帮助。
      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 2017-05-20
      • 2019-02-22
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多