我现在很困惑。
我有一个装满机场数据的数据库。我试图在我的控制台中调用来自不同记录的某些属性,但它不起作用。奇怪的是,它在我的heroku控制台中运行良好。例如:
如果我把:x = Airport.where(代码:" JFK")。当我键入" x"在我的控制台中,我获得了JFK的全部记录。但是,当我输入x.runway_length时,我得到一个方法错误。
奇怪的是,当我在Heroku控制台中执行相同的过程时,我将获得跑道长度(或我附加到" x"的任何其他属性)。
发生了什么?我错过了什么。
谢谢!
x = Airport.where(代码:" LAX")
Airport Load (2.9ms) SELECT "airports".* FROM "airports" WHERE "airports"."code" = 'LAX'
=> #<ActiveRecord::Relation [#<Airport id: 3533, code: "LAX", lat: 33.9456, lon: -118.391, name: "Los Angeles International Airport", city: "Los Angeles", state: "California", country: "United States", woeid: 12520706, tz: "America/Los_Angeles", phone: "", email: "", url: "", runway_length: 12091, elev: 126, icao: "KLAX", direct_flights: 200, carriers: 99, created_at: "2015-08-06 19:10:03", updated_at: "2015-08-17 03:05:53", current_high_temp: 84, current_low_temp: 70>]>
现在,当我尝试:x.current_high_temp
NoMethodError: undefined method `current_high_temp' for #<ActiveRecord::Relation::ActiveRecord_Relation_Airport:0x007fd89ed33b18>
答案 0 :(得分:1)
'Where'返回一个数组,并在其上调用实例方法。
尝试
x = Airport.where(code: "LAX").first
答案 1 :(得分:0)
问题在于您使用的方法。
Model#where
不会返回一个对象(正如预期的活动记录所示),您可以使用Model#find_by(attribute: expression)
在您的情况下使用:
x = Airport.find_by(code: "LAX")
答案 2 :(得分:0)
where(opts = :chain, *rest) public
返回一个新关系,它是根据参数中的条件过滤当前关系的结果。
即
x = Airport.where(code: "LAX")
Airport Load (2.9ms) SELECT "airports".* FROM "airports" WHERE "airports"."code" = 'LAX'
=> #<ActiveRecord::Relation [#<Airport id: 3533, code: "LAX", lat: 33.9456, lon: -118.391, name: "Los Angeles International Airport", city: "Los Angeles", state: "California", country: "United States", woeid: 12520706, tz: "America/Los_Angeles", phone: "", email: "", url: "", runway_length: 12091, elev: 126, icao: "KLAX", direct_flights: 200, carriers: 99, created_at: "2015-08-06 19:10:03", updated_at: "2015-08-17 03:05:53", current_high_temp: 84, current_low_temp: 70>]>
您注意到对象类型为ActiveRecord::Relation
而不是Airport
,Airport
对象包含数组文字[]
但是,集合类型不是数组。所以,
你想要使用
x = Airport.where(code: "LAX").first
or
x = Airport.where(code: "LAX")[0] # not recommended
如果'code'是唯一键,您可以使用
# this gives the first airport with code = 'LAX'
x = Airport.find_by_code("LAX")
或者如果您想查看所有机场的current_high_temp
,那么您可能想要这样做
x = Airport.where(code: "LAX").pluck('current_high_temp')
pluck(* column_names)public使用pluck作为选择一个或的快捷方式 没有加载一堆记录的更多属性只是为了抓住 你想要的属性。
Person.pluck(:name)
代替Person.all.map(&:name)