@vadimstroganov

Has_many как belongs_to?

Здравствуйте!

Вопрос такой. Есть таблица pages и page_translations

class Page < ActiveRecord::Base
  has_many :page_translations
end


class PageTranslation < ActiveRecord::Base
  belongs_to :page
end


В табличке есть несколько переводов одной страницы
page_id | locale | title | content

Можно ли как-то сделать join страницы для текущей локали?
То есть, cейчас я делаю так:
@page = Page.joins(:page_translations).first
@page.title # так не могу вытащить title, который берется из таблицы page_translations, тк он вытащил не одну запись, как я понимаю


Как сделать такой join, чтобы я имел доступ в title и content?

На SQL сделал так:
SELECT *
      FROM pages p
      JOIN page_translations pt
        ON pt.page_id = p.id
      WHERE p.parent_id = ?
        AND p.is_published = ?
        AND pt.locale = ?
      ORDER BY p.lft DESC


Но хотелось бы понять как такое сделать через ORM
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
@vadimstroganov Автор вопроса
Сделал так:
has_one  :page_translation, -> (object){ where("locale = ?", I18n.locale) }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Не очень понимаю зачем здесь джоины, id нужной страницы ведь уже известен?
@page = PageTranslation.where(page_id: 123, locale: "en")
@page.title


Update
тогда получается что-то вроде:
@page = Page.joins(:page_translations).where(page_translations: { page_id: 123}).first

first в данном случае выберет одну страницу со всеми ее переводами
where в таком виде не нужен, т.к. joins(:page_translations) уже сделает запрос с page_translations.page_id = page.id
@page.page_translations.first, вместо first можно любое условие, как будто делаем запрос в базу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы