我有以下活动记录模型:
class Dispatch < ActiveRecord::Base
has_one :waypoint
end
访问waypoint对象时,生成的查询将从模型中检索所有列:
pry(main)> d.waypoint
Waypoint Load (0.5ms) SELECT `waypoints`.* FROM `waypoints`
WHERE `waypoints`.`waypointable_id` = <dispatch_id>
LIMIT 1
如果我想从调度的航点中检索特定列,那么我应该使用select
范围has_one
ApiDock reference, section 4.2.3。不幸的是,这种方法会引发NoMethodError
:
pry(main)> d = Dispatch.last
pry(main)> d.waypoint.select('latitude, longitude')
Waypoint Load (19.4ms) SELECT `waypoints`.* FROM `waypoints`
WHERE `waypoints`.`waypointable_id` = <some_id> LIMIT 1
NoMethodError: private method `select' called for #<Waypoint:0x007fe77ed79c28>
我错过了什么?我尝试使用ActiveRecord 4.0.11和4.2.0。
基础查询应该是这样的:
SELECT latitude, longitude FROM `waypoints`
WHERE `waypoints`.`waypointable_id` = <some_id>
LIMIT 1
我知道我可以做到
Waypoint.where(waypointable_id: <some_id>).select('latitude, longitude').last
但是错过了has_one
关联的全部观点。因为它是文档中指定的功能,所以它应该正常工作,对吧?
答案 0 :(得分:1)
尝试:
Waypoint.select('latitude, longitude').where(...)
Activerecord select
是一种类方法:http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
答案 1 :(得分:0)
试试这个
d.waypoint.as_json(only: [:latitude, :longitude])
答案 2 :(得分:0)
默认情况下,has_one会检索整个对象,但是如果需要覆盖它,则无法对检索到的对象调用select,因为select是一个类方法。
尝试::
has_one :waypoint, -> { select "latitude, longitude"}
这将默认仅返回经度和纬度。