Rails Active Record查询包括委托属性

时间:2013-12-09 19:53:21

标签: ruby-on-rails ruby rails-activerecord

是否可以像这样进行查询? (伪码)

u=User.includes(all_delegated_attributes_from_relationships).all

如何?

进一步解释:

class User<ActiveRecord::Base
  has_one :car
  delegate :wheel, :brake, :motor, to: :car, prefix: true
end

然后:

u=User.includes(delegated_car_parts).all
#<user id: 1, car_id: 1, name: "John", car_wheel: "foo", car_motor: "bar", car_brake: false>

我知道这听起来有些奇怪,但我必须在旧应用程序中添加一个功能,将所有委托属性从模型导出到CSV,这个模型有14个关系和300个代表...我刚刚学习了得墨忒耳定律当我制作这个应用程序时...

2 个答案:

答案 0 :(得分:3)

假设车轮,休息和马达是汽车的关系,你可以这样做:

User.includes(:car => [:wheel, :brake, :motor]).all

答案 1 :(得分:2)

没有内置方法可以做到这一点。你可以尝试像:

class User < ActiveRecord::Base
  has_one :car

  DelegatedCarMethods  = [:wheel, :brake, :motor]
  delegate *DelegatedCarMethods, to: :car, prefix: true

  scope :with_car_delagations, lambda do
    select_array = ["#{table_name}.*"]
    select_array += DelegateCarMethods.map {|method| "#{Car.table_name}.#{method} AS car_#{method}"}
    select(select_array.join(', ')).joins(:car)        
  end
end

但它并不是非常漂亮。你为什么需要这个?致电user.wheeluser.motor感觉不对。