Хорошо, так что work_step - это то, что вы хотите использовать в нескольких моделях.
Итак, внутри миграции для CreateWorkSteps:
t.references :component, polymorphic: true
Это в основном делает
t.integer :component_id # Refers to id (of sub-assembly or part)
t.string :component_type # Refers to type of object (sub-assembly or part)
add_index :work_steps, [:component_type, component_id]
Теперь в вашей модели:
work_step.rb
belongs_to :component, polymorphic: true
sub_assembly.rb
has_many :work_steps, as: :component
has_many :parts
part.rb
has_many :work_steps, as: :component
belongs_to :site
belongs_to :car
belongs_to :sub_assembly, optional: true
Хорошо, поэтому вы хотите запросить базу данных и получить
- work_steps
- связан с деталями
- принадлежит сайту A и Car X и Z
Итак, вот список шагов, которые вы должны сделать в ActiveRecord (I 'Я не собираюсь давать ответ на один запрос, так как это слишком много усилий. Кроме того, порядок шагов находится в логическом порядке, но помните, что запросы ActiveRecord используют ленивую оценку, а запросы SQL оцениваются в определенном порядке.)
- # Соединить детали с сайтом и автомобилями
- Использовать # Где siteName находится в [A], carName находится в [X, Z]
- Теперь вы ЛЕВО соединяетесь с sub_assembly (Таким образом, даже если деталь не имеет sub_assembly_id, она не удаляется).
- Теперь это раздражающий шаг. При первом соединении вы захотите объединить parts_id с component_id AND component_type == "Part" (не забудьте добавить в таблицу ваши префиксы при присоединении, например, work_steps.component_id и делайте это с самого начала.)
- Для вашегово втором соединении вы захотите объединить sub_assembly_id с component_id AND component_type == "Sub_assembly"
- Теперь у вас есть ОГРОМНЫЙ объект ActiveRecord, выберите только то, что делает work_step.
Goodудачи! Я не буду держать вас за руку с заранее написанным ответом, потому что ... потому что мне лень загружаться в Rails, выполнять миграции, создавать модели, заполнять модели, а затем сам писать запрос. ;)
О да, и я все равно закончил тем, что дал один-единственный ответ