2011-01-18 4 views
4

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

Я пришел across a plugin это довольно гладкий, но мастер-ветви не работают с 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 

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

+4

Похоже, что вложенный has_many: теперь работает в Rails 3.1, FYI. – Slick23

ответ

8

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

Я имел такого рода вещи, как, например, в классе я преподавала в последнее время, версия Рельсы 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

Как я вижу у вас есть 2 варианта:

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

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

Если нажата, я бы с вариантом 1.

+0

Да, я понял, что добавление таблицы соединений между ними позаботится об этом. Я подумал, что, по линии названных областей, есть что-то, что тоже будет работать, но не было с ними знакомо. Я не настолько фантастичен в написании SQL и не делал этого в течение многих лет. – Slick23

+0

Вам не нужно писать SQL для названных областей. В этом весь смысл использования названных областей. Нет SQL! – Shreyas

+0

В примерах, которые я видел, у них был SQL. – Slick23

1

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

Смежные вопросы