Запрос Rails Active Record, включая делегированные атрибуты

Можно ли сделать такой запрос? (Псевдокод)

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 делегаций... Я только что выучил закон Деметры, когда сделал это приложение...


person CV-Gate    schedule 09.12.2013    source источник
comment
Что вы подразумеваете под делегированными атрибутами?   -  person BroiSatse    schedule 10.12.2013
comment
почему ты хочешь сделать это?   -  person John Naegle    schedule 10.12.2013


Ответы (2)


Предполагая, что колесо, тормоз и двигатель являются отношениями на автомобиле, вы можете сделать это:

User.includes(:car => [:wheel, :brake, :motor]).all
person John Naegle    schedule 09.12.2013
comment
Спасибо за ваш ответ, это то, что мне нужно, но у меня есть модель со многими отношениями и делегированиями, и я хотел бы сделать это более удобным способом. - person CV-Gate; 10.12.2013
comment
Кажется странным делом. Если вы посмотрите на источник для делегата (apidock.com/rails/Module/delegate), он генерирует методы, список делегированных методов отсутствует. Так что лучшее, что вы можете сделать, это что-то вроде ответа @BroiSatse. - person John Naegle; 10.12.2013

Для этого нет встроенного метода. Вы можете попробовать что-то вроде:

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.wheel или user.motor кажется неправильным.

person BroiSatse    schedule 09.12.2013
comment
Спасибо, это может указать мне в правильном направлении. Мне нужно это сделать, потому что у меня есть старое приложение со многими отношениями и делегированиями, и клиент попросил меня предоставить возможность экспортировать всю эту модель в CSV, а выбор каждого атрибута может быть очень утомительным. - person CV-Gate; 10.12.2013