ActiveRecord:选择has_one

时间:2014-12-30 18:49:38

标签: ruby-on-rails activerecord

我有以下活动记录模型:

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关联的全部观点。因为它是文档中指定的功能,所以它应该正常工作,对吧?

3 个答案:

答案 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"}

这将默认仅返回经度和纬度。