Rails,如何在where语句

时间:2016-12-30 12:39:00

标签: ruby-on-rails ruby activerecord

this stackoverflow-question获取,可以使用块进行查询,如下所示:

Consumer.find do |c|
  c.id == 3
end

我想对“where”查询执行相同的操作,例如:

mainCustomers = Customer.where do |c|
 c.id == c.main
end

当我这样做时,我会得到这样的结果:

=> #<ActiveRecord::QueryMethods::WhereChain:0x0055a057444560 @scope=#<ActiveRecord::Relation 

我无法使用ActiveRecord方法,例如:

irb(main):013:0> mainCustomers.last
NoMethodError: undefined method `last' for #<ActiveRecord::QueryMethods::WhereChain:0x0055a057444560>

irb(main):014:0> mainCustomers.count
NoMethodError: undefined method `count' for #<ActiveRecord::QueryMethods::WhereChain:0x0055a057444560>

在where语句中使用块的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

:where不接受阻止条件。

您可以使用纯SQL,如Customer.where('id = main'),如果它适用于您。

或者,您可以使用更复杂的方式...使用arel表。

consumer = Consumer.arel_table
Consumer.where(consumer[:id].eq(consumer[:main])).to_sql 
=> "SELECT \"consumers\".* FROM \"consumers\" WHERE \"consumers\".\"id\" = \"consumers\".\"id\""

答案 1 :(得分:1)

由于where不接受块,但接受具有数组值的哈希,因此您可以采用两步方法来获取Activerecord集合:

mainCustomers_ids = Customer.select { |o| o.id == o.main }.map{ |o| o.id} 
mainCustomers = Customer.where( id: mainCustomers_ids)

请记住,除了Customer类之外,您还可以使用Customer对象的任何Activerecord集合。

答案 2 :(得分:0)

您链接到的StackOverflow帖子显示find使用的to_a.findArray#find的快捷方式。因此它使用Ruby where方法,并且不执行除从数据库中检索所有客户的查询之外的查询。

将块传递给WhereChain实际上并没有做任何事情。它只会返回一个where,因为没有给出任何参数。见http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where

答案 3 :(得分:0)

documentation开始,puts "abc".size do |x| you_can_put_anything_you_want "here" it is ignored anyway end #=> 3 不接受阻止。

您可以指定它,但会被忽略。例如:

mainCustomers = Customer.where

您的代码仅相当于:

Customer.where.last

并使用

Article.where{created_at >= 2.weeks.ago}

提出了你在问题中提到的例外情况。

您提到的语法类似于squeel

--force

Squeel是一个伟大的宝石,但它似乎与Rails 5不兼容。