вложенный has_many: через рельсы 3 - PullRequest
4 голосов
/ 18 января 2011

Я знаю, что Rails не поддерживает вложенные has_many: через отношения, хотя уже были разговоры и открытая заявка на патч с Rails 2.

Я наткнулся на плагин , который довольно приятный, но основные ветки не работают с Rails 3, и я не решаюсь использовать его для критически важных задач в приложении, отсюда и отсутствие активного Недавнее развитие. Итак - как лучше всего справиться с этими отношениями.

class Author < ActiveRecord::Base
  has_many :contracts
  has_many :products, :through => :contracts

class Product < ActiveRecord::Base
  has_many :contracts
  has_many :orders
  has_many :authors, :through => :contracts

class Contracts < ActiveRecord::Base
  belongs_to :author
  belongs_to :product

Итак, все, что есть, было бы здорово получить заказы, добавив это к модели Автора:

has_many :orders, :through => :products

Но, увы, вы не можете - по крайней мере, без плагина. Итак, мой вопрос: каков наилучший подход к доступу ко всем авторским заказам, когда единственная связь между моделью соединения, Контрактами?

Ответы [ 3 ]

8 голосов
/ 19 января 2011

Если вы не пытаетесь создать объекты через вложенную ассоциацию и хотите использовать ее только для поиска, тогда области в Rails 3 - отличный способ сделать это. В качестве альтернативы вы можете реализовать метод класса.

У меня была такая вещь в качестве примера в классе, который я недавно преподавал, версия кода на Rails 3 здесь: https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/app/models/user.rb

См. Определение метода предметов. Спецификации здесь: https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/spec/models/user_orders_spec.rb

Обновление Rails 3.1: Как уже заметил один комментатор, Rails 3.1 поддерживает has_many: через ассоциации более чем на один уровень.

1 голос
/ 19 января 2011

Билет, похоже, больше не активен для включения патча в ядро ​​Rails.Я бы представил это ... похоже, что это должно быть что-то, что должно просто работать в Rails.

1 голос
/ 18 января 2011

На мой взгляд, у вас есть 2 варианта:

  1. Возможно, вам придется пересмотреть ваши решения по моделированию. Например, установить связь «многие ко многим» между Заказчиком и Продуктом посредством Заказа. А затем инкубировать контракт.

  2. Используйте именованную область (или область в Rails 3), чтобы получить заказы автора.

При нажатии я бы выбрал вариант 1.

...