Rails:方法查询

时间:2019-01-23 19:38:44

标签: ruby-on-rails activerecord

我有一个带有Airport列和country方法的#region模型。

Airport.where(country:"United States"),查询一列,返回类Airport::ActiveRecord_Relation的AR对象的漂亮的可用“数组”。

但是:

Airport.where(region: nil)      
  Airport Load (1.8ms)  SELECT "airports".* FROM "airports" WHERE "airports"."region" IS NULL                                                                                              
=> #<Airport::ActiveRecord_Relation:0x3fecc5d319f8>

属于同一类,但几乎是一个“密封盒”,我无法调用#count#first或其他任何东西。

我可以使用select来获得“正确的数组”,但是随后我的控制台发出了无数的SQL查询而不是一个。

如何获取需要的数据作为可访问数组?

1 个答案:

答案 0 :(得分:2)

ActiveRecord专门负责为您从数据库中获取信息-并且由于regionAirport模型上的方法,而不是数据库列,因此您不会得到预期的结果。在为您的查询生成的SQL语句中很容易看到这一点-它正在寻找名为region的列:

SELECT "airports".* FROM "airports" WHERE "airports"."region" IS NULL

您关于select是执行此操作的正确方法的直觉是正确的。使用select不应生成捆绑的SQL查询。试试:

Airport.all.select { |a| a.region.nil? }

并检查生成的SQL。您应该看到类似以下内容的

Airport Load (7.1ms)  SELECT "airports".* FROM "airports"

也就是说,除非#region内有其他ActiveRecord查询,否则我们需要查看方法定义才能做出其他判断。