Создание ассоциаций для модели на основе подписки? - PullRequest
0 голосов
/ 03 апреля 2012

у меня 3 модели.Это модели User, Product и Price.Я хочу, чтобы Users мог подписаться на Products и смотреть модель Price по более низким ценам.Я думаю о том, как это настроить, но не выяснил правильные ассоциации.

Мои ассоциации на данный момент выглядят так:

Примечание: много полей (таблицастолбцы также были стерты для простоты

class User
  has_many :prices, :dependent => :destroy
  has_many :products, :through => :prices
end

class Product
  # table columns - :name
  has_many :prices
  has_many :users, :through => :prices
end

class Price 
  # table columns - :cost, :user_id, :product_id, :store_id
  belongs_to :user
  belongs_to :product
  belongs_to :store
end

Я собирался установить это, сделав логическое значение в Product модели под названием :watch_product, но я застрял в ассоциациях.Должен ли я дать Product a user_id или наоборот?У меня есть :through связь, но нет user_id на Product или product_id на User.Должен ли watch_product перейти на Price вместо этого?

1 Ответ

1 голос
/ 03 апреля 2012

Я бы не стал хранить информацию о пользователе в модели Price.Я бы представил отдельную модель для хранения подписки пользователя на продукт.

class User
  has_many :user_products
  has_many :products, :through => :user_products
  has_many :prices, :through => :products 
end

class UserProduct
  belongs_to :user
  belongs_to :product
end

class Product
  has_many :prices
  has_many :user_products
  has_many :users, :through => :user_products
end

class Price 
  # table columns - :cost, :product_id, :store_id
  belongs_to :product
  belongs_to :store

  scope :by_product, lambda {|product| where(:product_id => product)}
  scope :by_store, lambda {|store| where(:store_id => store)}
end

Теперь вы можете получить цены для пользователя следующим образом:

user.prices.by_product(12)
user.prices.by_store(10)
user.prices.by_product(12).by_store(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...