Сложное определение ассоциации ActiveRecord - PullRequest
2 голосов
/ 27 июля 2010

Как бы вы отобразили пунктирную ассоциацию, используя ActiveRecord? Есть ли ActiveRecord-способ сделать это? Я хочу, чтобы все уникальные акции были доступны для конкретного товара.

Diagram

Вот то, о чем я думал, но мне не очень нравится:

Использование пользовательского поиска

class Item < ActiveRecord::Base
  has_many :promotions, :finder_sql => "SELECT..FROM promotions..purchase_option_id IN (...)"
end

Грязный и неэффективный, но рубиновый путь

my_item.purchase_options.map(&:promotion).uniq

Прерывание связи PurchaseOption <-> Promotion HABTM и создание новой для Item <-> PromotedPurchaseOption

class Item < ActiveRecord::Base
  has_many :promoted_purchase_options
  has_many :promotions, :through => :promoted_purchase_options
end

Другие мысли

Не думаю, что будет хорошей идеей использовать именованные области действия или определять новые методы Это не будет просто работать или будет выполнять неэффективные запросы, если их использовать:

Item.first.promotions.count
Item.first.promotions.available
Promotion.first.items.all

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Может быть, это:

class Item < ActiveRecord::Base
  has_many :purchase_options
  has_many :promotions, :through => :purchase_options, :uniq => true
end
0 голосов
/ 27 июля 2010

Я не знаю, почему вы против именованных областей или пользовательских методов.Эти вещи могут помочь уменьшить сложность, инкапсулируя большую часть логики запроса.По возможности избегайте пользовательских finder_sql в ваших отношениях.

Если вы используете устаревший метод отношений has_and_belongs_to_many, вам, вероятно, следует переключить его на модель прямого соединения.Подход has_many ...,: through даст вам намного больший контроль над связями между моделями, и вы сможете напрямую изменять свойства модели соединения.

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