我有一个带有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查询而不是一个。
如何获取需要的数据作为可访问数组?
答案 0 :(得分:2)
ActiveRecord专门负责为您从数据库中获取信息-并且由于region
是Airport
模型上的方法,而不是数据库列,因此您不会得到预期的结果。在为您的查询生成的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查询,否则我们需要查看方法定义才能做出其他判断。