Ruby on rails 在Rails中使用includes()和where()时ArgumentError(参数数目错误(给定1,预期2))
我试图调试Ruby on rails 在Rails中使用includes()和where()时ArgumentError(参数数目错误(给定1,预期2)),ruby-on-rails,Ruby On Rails,我试图调试rails5.1.5,postgres2.1.3中的一个问题。此查询在我的生产环境中运行良好,但当我在本地复制数据库并尝试执行相同操作时,会出现以下错误: Author.includes(:books).where({books: {id: 1}}) ArgumentError (wrong number of arguments (given 1, expected 2)) 我尝试过的其他每一个查询都有效,我检查过的所有数据/版本似乎都相同。如果数据库中根本没有作者,这也会失败
rails5.1.5
,postgres2.1.3
中的一个问题。此查询在我的生产环境中运行良好,但当我在本地复制数据库并尝试执行相同操作时,会出现以下错误:
Author.includes(:books).where({books: {id: 1}})
ArgumentError (wrong number of arguments (given 1, expected 2))
我尝试过的其他每一个查询都有效,我检查过的所有数据/版本似乎都相同。如果数据库中根本没有作者,这也会失败
在Author模型中,关系是这样建立的
has_many :books, dependent: :destroy
我尝试过完全删除数据库,从头开始重新创建数据库,等等
有人知道从这里挖到哪里吗?这是不是太过分了?或者您有现有的作用域吗
Author.includes(:books).where(books: {id: 1})
而不是
Author.includes(:books).where({books: {id: 1}})
这是rails 5语法,如果您使用的是rails 5。在的rails文档中,您将在这里看到它是如何工作的
User.includes(:posts).where('posts.name = ?', 'example')
所以,当rails对你大喊大叫时
ArgumentError (wrong number of arguments (given 1, expected 2))
它可能希望你给它
Author.includes(:books).where("books.id = ?", 1)
这对我来说没有多大意义(因为你的语法应该可以工作),但当你得到“它需要2个参数”时,这是你首先想到的,因为在旧版本的Rails中,它就是这样工作的
其他一些选项可能包括使用(我的最爱):
它本质上使用ActiveRelation执行左连接,将两个查询合并为一个sql查询。回答得好。顺便提一下,这种语法早于rails 5。你说的超嵌套/现有范围是什么意思?我用我的第一个命令在Rails控制台中运行这个命令,所以没有太多其他的事情发生。我尝试了新的语法,它有完全相同的行为;在生产环境下工作,在本地错误的参数数量下失败。是否有堆栈跟踪来跟踪该错误?你确定错误是由那行代码引起的吗?我正在rails控制台上运行它,所以我确定,其余的回溯只是回溯(最近一次调用):1:from(irb):3。它可能来自ActiveRecord等中被该行代码调用的任何内容,但回溯中没有其他内容可以提供提示。首先将其拆分为两部分(
q=Author.includes(:books);q=q.where(…)
),然后包括堆栈跟踪。
Author.joins(:books).merge(Book.where(id: 1))