从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语句中使用块的正确方法是什么?
答案 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.find
是Array#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不兼容。