我是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,然后添加到新数组。但有没有任何方法可以根据列的值快速过滤活动记录结果?
答案 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 == 0
或results[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 }