2013-12-09 5 views
1

Возможно ли сделать такой запрос? (Псевдокод)Rails Активный запрос записи, включая делегированные атрибуты

Как?

Дальнейшее объяснение:

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

+0

Что вы подразумеваете под делегированными атрибутами? – BroiSatse

+0

Почему вы хотите это сделать? –

ответ

2

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

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

Спасибо за ваш ответ, вот что мне нужно получить, но у меня есть модель со многими отношениями и делегациями, и я хотел бы сделать это более удобным образом. –

+0

Кажется, это странная вещь. Если вы посмотрите на источник для делегата (http://apidock.com/rails/Module/delegate), он генерирует методы, нет списка методов, которые были делегированы. Так что в значительной степени лучшее, что вы можете сделать, это что-то вроде ответа @BroiSatse. –

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.wheel или user.motor не чувствует себя хорошо.

+0

Спасибо, он может указать мне в правильном направлении. Мне нужно это сделать, потому что у меня есть старое приложение со многими отношениями и делегациями, и клиент спросил меня о возможности экспорта всей этой модели в CSV, и это может быть очень утомительным выбором каждого атрибута. –

Смежные вопросы