Как написать сложный запрос на соединение с Ruby on Rails 5.2? - PullRequest
0 голосов
/ 23 февраля 2019

Мое приложение управляет описаниями бизнес-правил на нескольких языках.Чтобы отобразить индекс бизнес-правил (имя и описание), мне нужно присоединить модель BusinessRule к модели перевода.Модель перевода полиморфна:

 Table name: translations

  id            :integer          not null, primary key
  document_type :string
  document_id   :bigint(8)
  field_name    :string(30)       not null
  language      :string(2)        not null
  translation   :text
  searchable    :tsvector
  created_at    :datetime         not null
  updated_at    :datetime         not null

Чтобы упростить задачу, я определил псевдонимы отношений с бизнес-правилами в business_rule.rb модели:

  has_many :name_translations, -> { where("field_name='name'") }, class_name: 'Translation', as: :document
  has_many :description_translations, -> { where("field_name='description'") }, class_name: 'Translation', as: :document

Чтобы построить индекс, мне нужно оставить внешнее объединение бизнес-правил с соответственно name_translations и description_translations для языка текущего пользователя, который становится в SQL:

select BR.code, TR1.translation as name, TR2.translation as description
from dqm_app.business_rules BR
left outer join dqm_app.translations TR1 on (TR1.document_id = BR.id and TR1.field_name='name' and TR1.language='en')
left outer join dqm_app.translations TR2 on (TR2.document_id = BR.id and TR2.field_name='description' and TR2.language='en')

, который я пытаюсь преобразовать как (при условии, что язык пользователяанглийский):

@business_rules = BusinessRule.left_outer_joins(:name_translations, :description_translations).
where(:name_translations.language = 'en' and description_translations.language = 'en')

Это вызывает 2 проблемы:

1 - ActiveRecord :: StatementInvalid (PG :: AmbiguousColumn: ERROR: ссылка на столбец «field_name» является неоднозначной) [конечно, он появляется дважды в запросе ]

2 - условие , где неверно, и я не знаю, как его построить.

Вы можете мне помочь?

Спасибо большое!

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Благодаря smathy я наконец решил две проблемы:

1 - добавлено устранение неоднозначности с синтаксисом хэша в модели BusinessRule

has_many :name_translations, -> { where(field_name: 'name') }, class_name: 'Translation', as: :document
has_many :description_translations, -> { where(field_name: 'description') }, class_name: 'Translation', as: :document

2 - поскольку модель BusinessRule не хранит язык, но профиль пользователя делает, в методе index я добавил предложение where, которое ссылается на таблицу translations :

  @business_rules = BusinessRule.left_outer_joins(:name_translations, :description_translations).
    where(translations: {language: user_language})

Обратите внимание, что мне не удалось получить предложение where для ссылкиto: name_translations или: description_translations.

0 голосов
/ 23 февраля 2019

Чтобы разрешить (1) изменить ваши области, чтобы использовать синтаксис хеша, Rails затем добавит устранение неоднозначности, например.

has_many :name_translations, -> { where(field_name: 'name') }, class_name: 'Translation', as: :document

Для разрешения (2) это зависит, есть ли поле в BusinessRuleкакой язык хранится?Если есть, то знайте, что Rails передаст сам экземпляр BusinessRule в область, если вы позволите, поэтому вы можете сделать что-то вроде этого:

has_many :name_translations, -> br { where(field_name: 'name', language: br.language) }, class_name: 'Translation', as: :document
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...