Как запросить несколько связанных таблиц в Rails - PullRequest
0 голосов
/ 26 марта 2019

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

class Lead < ApplicationRecord
    has_many :employee_leads
    has_many :employees, :through => :employee_leads
end

class EmployeeLead < ApplicationRecord
    belongs_to :employee
    belongs_to :lead
end

class Employee < ApplicationRecord
    has_many :employee_leads
    has_many :leads, :through => employee_leads
    has_many :emp_stores
    has_many :stores, :through => emp_stores
end

class EmpStore < ApplicationRecord
    belongs_to :store
    belongs_to :employee
end

class Store < ApplicationRecord
    has_many :emp_stores
    has_many :employees, :through => :emp_stores
end

Мое приложение потребовало, чтобы я выяснил, к какому магазину принадлежит каждое ведение. Я знаю, как присоединиться к руководству сотрудника, а это:

Lead.joins(employee_leads: :employee)

и я тоже знаю, как присоединить сотрудника к магазину

Employee.joins(emp_stores: :store)

Те работают на меня без проблем. Когда я пытался получить ведущее соединение в магазин, я использовал:

Lead.joins(employee_leads: :employee { emp_stores: :store })

Это дало мне синтаксическую ошибку, я ссылаюсь на ссылку Active Record относительно присоединения к вложенным ассоциациям (многоуровневая), и я до сих пор не могу понять это. Я очень новичок в этом, пожалуйста, кто-нибудь, найдите время, чтобы объяснить и помочь мне. Спасибо.

1 Ответ

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

Попробуйте это:

Lead.joins(employee_leeds: [employee: [amp_stores: :store] ])

Я считаю, что эти варианты также должны работать:

Lead.joins(employee_leeds: [{employee: [{amp_stores: :store}] }])
Lead.joins(employee_leeds: {employee: {amp_stores: :store} })

Хотя, в зависимости от того, как вы используете это, вы можете рассмотреть возможность использования includes вместо joins. Соединения загружаются лениво, тогда как включения загружаются с нетерпением.

В качестве объяснения того, почему ваш синтаксис был неправильным ... :something является символом. А в старом мире (до ruby ​​1.9) пары хэш-ключ / значение записывались так: :key => :value. Однако из Ruby 1.9 был предоставлен более новый синтаксис key: :value.

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

# Old syntax
:employee_leads => [ :employee => [ :emp_stores => :store ] ]

Что, если учесть новый синтаксис для хэшей, надеюсь, сделает это более логичным для понимания:

# New syntax
employee_leads: [ employee: [ emp_stores: :store ] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...