Как запросить полиморфную связанную связь для возврата данных из нескольких таблиц - rails4

У меня есть несколько таблиц, которые объединены полиморфной ассоциацией...

Я пытаюсь найти способ сделать одиночный запрос для возврата данных из нескольких этих таблиц...

Мои модели следующие:

#profile.rb
class Profile < ActiveRecord::Base
  has_many :user_profiles, dependent: :destroy
  has_many :wizards, through: :user_profiles, source: :user, source_type: "Wizard"
end

#user_profile.rb
class UserProfile < ActiveRecord::Base
  belongs_to :user, polymorphic: true, dependent: :destroy
  belongs_to :profile
end

#wizard.rb
class Wizard < ActiveRecord::Base
  has_one :user_profile, as: :user, dependent: :destroy
  has_one :profile, through: :user_profile
  has_one :wizard_specialization, dependent: :destroy
  has_one :career, through: :wizard_specialization
end

#career.rb
class Career < ActiveRecord::Base
  has_many :wizard_specializations, dependent: :destroy
  has_many :wizards, through: :wizard_specializations
end

Как написать запрос соединения (или :includes), чтобы вернуть профиль всех мастеров, а также их информацию из таблицы profiles, а также включить их специализацию из таблицы careers в таблицу wizard_specializations?

Заранее спасибо.

PS: будет здорово, если я смогу исключить такие поля, как created_at и updated_at


person x6iae    schedule 23.05.2016    source источник


Ответы (2)


Вы можете использовать метод includes ActiveRecord для быстрой загрузки связанных данных. Объедините это с методом select, чтобы включить или исключить только те столбцы, которые вы хочу:

Wizard.includes(:career, :profile).select('wizards.name', 'wizards.etc', 'careers.name', 'careers.etc', 'profiles.*')
person Ryan Crispin Heneise    schedule 23.05.2016
comment
Спасибо за ответ... как я могу включить данные из таблицы profiles? - person x6iae; 23.05.2016
comment
Я могу загрузить что-то вроде этого: Wizard.includes(wizard_specialization: :career, user_profile: :profile), но я не могу выбрать ничего из какой-либо другой таблицы, кроме таблицы wizards. - person x6iae; 23.05.2016
comment
Вы должны быть в состоянии сделать Wizard.includes(:career, :profile). Я думаю, что ActiveRecord автоматически пройдет через зависимость through и включит профиль для этого мастера. - person Ryan Crispin Heneise; 23.05.2016
comment
К вашему сведению, здесь вопрос SO, который объясняет, как исключить определенные столбцы, что было бы проще, чем выписывать список включенных столбцов: stackoverflow.com/questions/17431028/ - person Ryan Crispin Heneise; 23.05.2016
comment
Да, я могу это сделать... но проблема возникает, когда я пытаюсь выбрать... поэтому .select('wizards.id, wizards.name'... работает... но ломается, когда я пытаюсь выбрать из career или profile - person x6iae; 23.05.2016

Я не уверен, поддерживает ли Rails прямые запросы AR со всеми моими настройками...

В любом случае, я наконец решил написать его на чистом SQL и выполнить с помощью:

ActiveRecord::Base.connection.execute(query)

где query содержит мой чистый оператор SQL с SELECTs и JOINs и WHEREs

person x6iae    schedule 23.05.2016