Соедините две модели RailR ActiveRecord в третьей модели - PullRequest
0 голосов
/ 22 мая 2018

Моя проблема заключается в следующем: у меня есть две модели, A и B. Теперь я хочу создать третью модель C, которая ссылается на две другие модели A и B, чтобы объект модели C мог «содержать» несколько объектов.из A и B.

Что я хочу с этим сделать: У моделей A и B есть атрибут с именем hero_image.Теперь я хочу показать все: hero_images из A и B, которые объединены в объекте C.

На самом деле я не уверен, нужна ли мне модель C вообще.У меня есть проекты и конкурсы, и я хочу присоединить их к коллекции.

projects = Project.where.not(hero_image: nil)
competitions = Competition.where.not(hero_image: nil)

Теперь я хочу присоединиться к этим двум коллекциям.

Я преследовал не того кролика.Все, что мне нужно, это

collection_of_proj_and_comps = projects + competitions

Спасибо за ваш совет.Позвольте мне переосмыслить проблему.

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Это действительно зависит от того, чего вы пытаетесь достичь, но вы можете попробовать добавить это представление в свою базу данных (не путать с представлениями в MVC).

create or replace view hero_images as
select 
  hero_image, 
  id source_id,
  'Project' source_type
from projects
union all
select
  hero_image,
  id source_id,
  'Competition' source_type
from competitions

(обратите внимание, что синтаксис для вашей базы данных может быть другим, это синтаксис Oracle).

Если вы затем запросите их в базе данных, вы увидите изображение героя иоткуда она взялась.

Если вы затем напишите модель с именем HeroImage, она должна вернуть нужные вам данные.

Возможно, вам также понадобится ссылка на источник

class HeroImage < ActiveRecord::Base

  primary_key :source_id

  belongs_to :source, polymorphic: true

end

Я не уверен, что это то, что вам нужно, но он должен собрать все эти данные вместе.


Что это делает:

A база данныхview - это стандартный оператор SQL, который может запрашиваться как таблица (но только для чтения).

Оператор union возвращает результаты двух или более операторов SQL сте же имена столбцов, что и в одной таблице результатов.

A полиморфная ссылка использует * _type для определения, к какой модели принадлежит связанный объект, и * _id для поиска конкретного экземпляра.

0 голосов
/ 22 мая 2018
projects = Project.where.not(hero_image: nil)
competitions = Competition.where.not(hero_image: nil)

Я преследовал не того кролика.Все что мне нужно это

collection_of_proj_and_comps = projects + competitions
0 голосов
/ 22 мая 2018

Вы все еще можете использовать оператор трубы union, чтобы присоединиться к двум спискам объектов ActiveRecord.

projects = Project.where.not(hero_image: nil)
competitions = Competition.where.not(hero_image: nil)
collection_of_proj_and_comps = projects | competitions

Это даст вам массив всех этих объектов в одном списке.

Я бы просто добавил тесты, чтобы убедиться, что они оба "крякают", как друг друга.Поэтому добавьте тесты, чтобы убедиться, что они оба отвечают на hero_image и другие вещи, которые вы будете делать с этой объединенной коллекцией позже.


Старый ответ на предварительно отредактированный вопрос

Для простоты ввода синтаксиса я переделываю сценарий для пользователей, имеющих много постов и комментариев.

В вашем классе пользователя вы можете сделать что-то вроде

@user.comments.pluck(:hero_image) | @user.posts.pluck(:hero_image)

Это создаст два массива, затем объединит их, удалив дублирующиеся записи из перекрытия между двумя запросами.

...