Моделирование отношений между пятнами и галлереями аля Foursquare - PullRequest
0 голосов
/ 20 февраля 2010

Вот совок:

В качестве учебного упражнения я пытаюсь написать клон Rails одной из многих игр на основе определения местоположения (Foursquare, Gowalla и т. Д.). У меня есть пользователи, которые создают и в магазины.

В терминах ActiveRecord:

:user has_many :stores
:store belongs_to :user

Но теперь я создал третью модель - Checkins. Таблица позади модели содержит два поля: user_id (для записи, какой пользователь сделал проверку) и store_id (для записи, в какое хранилище зарегистрировался этот пользователь).

Еще раз, в терминах AR:

:checkin belongs_to :user
:checkin belongs_to :store

:user has_many :checkins
:store has_many :checkins

Все это работает хорошо - в моих представлениях «Пользователь» и «Магазин» я могу вызывать @ user.checkins и @ store.checkins соответственно. Единственное, таким образом, я могу получить только user_id или store_id, где я действительно хочу получить имя пользователя или имя магазина. Поэтому я считаю, что промежуточная таблица регистрации отлично подходит для использования: through:

:user has_many :stores, :through => :checkins
:store has_many :users, :through => :checkins

Это имеет смысл, но дело в том, что пользователь уже has_many хранит - те, которые он создал! И на его странице пользователя мне нужно перечислить и магазины, которые он создал, и те, в которых он зарегистрировался. Я все еще пытаюсь обернуть голову вокруг has_many_and_belongs_to, так что я не уверен, установит ли это меня в правильном направлении. Кто-нибудь хочет предложить подсказку?

1 Ответ

0 голосов
/ 20 февраля 2010

Rails позволяет легко справиться с этой ситуацией. Одно из решений: ваш пользователь может использовать другое имя отношения для второго набора магазинов. Например:

class Checkin
  belongs_to :store
  belongs_to :user
end

class Store
  belongs_to :user
  has_many :checkins
end

class User
  has_many :stores
  has_many :checkins

  has_many :visited_stores, :through => :checkins, :source => :store
end

Использование опции :source указывает ActiveRecord искать ассоциацию Checkin :store при построении списка посещенных магазинов. В качестве альтернативы, вы могли бы сказать

has_many :created_stores, :class_name => "Store"
has_many :stores, :through => :checkins

В этом случае вы переименовываете собственные магазины вместо посещаемых.

...