Рельсовые ассоциации (кошмар многих ко многим) - PullRequest
0 голосов
/ 16 мая 2011

У меня есть организация, у которой много продуктов.Эти продукты находятся в различных категориях.Существует также более одной организации.И продукт может относиться к нескольким категориям.

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

@org = Organisation.first

@org.categories  => spits out a list of categories being used by the products for that organisation
@org.products => spits out a list of products for that organisation
@org.categories[0].products => spits out a list of products for the first category

Кроме того, я хотел бы категориибыть доступным для других организаций, так что, если мне удастся создать категорию при добавлении продукта в организацию 1, эта категория также будет доступна для продукта, который я добавляю для организации 2.

1 Ответ

2 голосов
/ 19 мая 2011

Это, вероятно, как вы должны настроить свои модели ( документы ):

РЕДАКТИРОВАТЬ: Обновленный ответ

class Organisation < ActiveRecord::Base
  has_many :products

  def categories
    # I don't like this way anymore
    # @_categories ||= products.map(&:categories).flatten.uniq
    # Do this
    @categories ||= Category.for_organisation(self)
  end
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories  # foreign keys in the join table
  # A product references an organisation.
  belongs_to :organisation             # foreign key - organisation_id
end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products    # foreign keys in the join table

  def self.for_organisation(org)
    query = %{
      id in (
        select category_id from categories_products where product_id in (
          select id from products where organisation_id = ? ) )
    }
    where(query, org.id)
  end
end

Возможные ошибки: для этого требуется таблица соединений, у которой нет соответствующей модели или первичного ключа

Вот пример примера приложения с использованием этой техники. Файл readme поможет вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...