在ruby中过滤活动记录结果

时间:2015-09-16 15:31:08

标签: ruby-on-rails ruby

我是Ruby on Rails的新手。我正在使用现有的API,我有一个sql查询,执行时:

results = ActiveRecord::Base.connection.select_all(query)

结果的输出是:

{"availability"=>"In Stock", "available_to_purchase"=>1}
{"availability"=>"Void", "available_to_purchase"=>0}
{"availability"=>"Out of Stock", "available_to_purchase"=>0}
{"availability"=>"In Stores Only", "available_to_purchase"=>0}

我知道希望根据available_to_purchase为0获取所有可用性值。我尝试过:

res = results.where(available_to_purchase: 0)

但是我收到一个错误说:

undefined method `where'

我也尝试过:

res = results.select { |result| result.available_to_purchase == 0 }

但我最终得到了错误:

undefined method `available_to_purchase'

我知道我可以遍历并检查available_to_purchase为0,然后添加到新数组。但有没有任何方法可以根据列的值快速过滤活动记录结果?

3 个答案:

答案 0 :(得分:3)

直接浏览connection可以避免几乎所有ActiveRecord旨在为您提供的内容。首先,请阅读Active Record Basics。 Rails指南非常合理,应该包含使用框架的前几周所需的一切。

您未获得预期的where方法的原因是它是ActiveRecord::Relation上的方法,而select_all只返回哈希列表。当你致电results.where时,为时已晚。您需要实例化Product模型(或任何与您的表名匹配的模型),这很简单:

class Product < ActiveRecord::Base
end

Rails会查看products表格中的Product表格(再次,我正在编写您的表格名称),然后您就可以根据它们进行查询where

results = Product.where(available_to_purchase: 0)

该模型还具有您尝试使用的访问方法,因此您可以执行results[0].available_to_purchase == 0results[0].availability = 'Already in your house'等操作。

答案 1 :(得分:2)

为了在结果上调用.where,您需要一个活动记录关系的实例。常规的ActiveRecord查询将返回此信息。但是,select_all返回一个哈希数组。数组没有方法。

res = results.select { |result| result.available_to_purchase == 0 }

您的第二个错误是因为您尝试错误地访问ruby哈希键。属性必须以result['available_to_purchase']

的形式访问

答案 2 :(得分:2)

以下是您问题的答案。虽然你应该使用ActiveRecord,但我确实同意其他人的意见。

results.select { |result| result['available_to_purchase'] == 0 }