Создание нескольких отношений в рельсах с одинаковыми типами данных - PullRequest
0 голосов
/ 29 марта 2010

То, что я пытаюсь сделать, выглядит примерно так:

Например, у меня есть типы данных "user" и "article". Я хочу иметь отношения между этими двумя, но более чем одним способом.

Так, например, я бы хотел, чтобы пользователь "понравился" или "добавил в закладки" статью. Поэтому мне нужно иметь два отношения в базе данных, одно для пользователей, которым нравится статья, и другое для пользователей, добавляющих закладки, поэтому, например, создание таблицы «user_article» будет недостаточно, верно?

Каков наилучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

То, что вы описываете, это «Модели данных», а не «Типы данных». Типы данных = строка, целое число и т. Д. Если это конкретный объект активной записи, это, в частности, модель данных или модель активной записи.

Eimantas указал, что вы описываете 2 отношения "has_many", но не "have_many", как написано в его посте. В его примере закладки называются моделью соединения. Помните, что вы можете помещать другие вещи в модель соединения и использовать их там для выполнения задач. Допустим, вы хотите заказать закладку или выбрать любимый рейтинг - идеальным местом для этого является модель соединения.

Разобранный пример:

class Article < ActiveRecord::Base
  has_many :users, :through => :user_bookmarks
end

class UserBookmark < ActiveRecord::Base
  belongs_to :user
  belongs_to :article
end

class User < ActiveRecord::Base
  has_many :user_bookmarks
  has_many :articles, :through => :user_bookmarks
end

На что посмотреть после ознакомления с основами: Счетчики кэшей - если вы делаете подсчеты, они ваши друзья.

Вероятно, гораздо проще и понятнее просто использовать эти две модели соединения, чем пытаться погрузиться в полиморфизм прямо сейчас. После того, как вы это запустите, вы можете исследовать это следующим.

0 голосов
/ 29 марта 2010

Я бы предложил Bookmarking модель с bookmarking_type (обратите внимание, что type зарезервировано для RoR). Тогда вы могли бы has_many :bookmarkings и has_many :liked_articles, :through => :bookmarkings и has_many :bookmarks, :through => :bookmarkings. Конечно, вы должны добавить условия или просто присоединить SQL к этим ассоциациям, но все должно быть хорошо. Я верю, что есть даже плагин для этого, просто не могу вспомнить имя atm.

...