Как определить следующие, используя отношения - PullRequest
1 голос
/ 15 сентября 2010

Мне нужна одна таблица, в которой я могу установить пользовательские предпочтения. Мне нужна одна таблица, в которой установлены все значения предпочтений, и другая таблица отношений, в которой у меня будут user_id и preference_id, но мне нужно иметь предпочтение для трех разные страницы

  1. пункт
  2. любимый
  3. последнее время.

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

prefrence table 
id
value

user_preferences 
id
item_result (foreign_key prefernce_id)
favorite_result (foreign_key preference_id)
recent_result (foreign_key preference_id)

Я хочу что-то, что позволит мне извлекать значения, как мы делаем user.item.name так же, как я хочу сделать user_preference.item_result.value

Ответы [ 2 ]

0 голосов
/ 16 сентября 2010

Я решил проблему самостоятельно. Перед публикацией ответа я должен сказать, что все должны использовать консоль пользователя rails

У меня есть следующие соотношения

class User < AR::Base
  has_one :item_preference
  has_one :item_preference, :through => :user_preference, :source => :item

  has_one :favorite_preference
  has_one :favorite_preference, :through => :user_preference, :source => :favorite

  has_one :recent_preference
  has_one :recent_preference, :through => :user_preference, :source => :recent

  has_one :user_preference
end

class UserPreference < ActiveRecord::Base
  belongs_to :item,
  :foreign_key => "item_results",
  :class_name => "Preference"

  belongs_to :favorite,
  :foreign_key => "favorite_results",
  :class_name => "Preference"

  belongs_to :recent,
  :foreign_key => "recent_results",
  :class_name => "Preference"

  belongs_to :user
end

class Preference < ActiveRecord::Base
  has_many :item_preferences,
    :foreign_key => "item_results",
    :class_name => "UserPreference"

  has_many :favorite_preferences,
    :foreign_key => "favorite_results",
    :class_name => "UserPreference"

  has_many :recent_preferences,
    :foreign_key => "recent_results",
    :class_name => "UserPreference"

end  

Теперь я могу получить доступ к значениямкак

User = User.find(16)
user.item_preference
[:] [DEBUG] [2010-09-16 17:09:54] [           App::OnlineOrdering] -   Preference Load (0.4ms)   SELECT `preferences`.* FROM `preferences` INNER JOIN `user_preferences` ON `preferences`.id = `user_preferences`.item_results WHERE ((`user_preferences`.user_id = 16)) 
=> #<Preference id: 1, value: "20", created_at: "2010-09-15 15:13:04", updated_at: "2010-09-15 15:13:04">

и наоборот

preference = Preference.find(1)

preference.item_preferences
[:] [DEBUG] [2010-09-16 17:09:23] [           App::OnlineOrdering] -   UserPreference Load (0.4ms)   SELECT * FROM `user_preferences` WHERE (`user_preferences`.item_results = 1) 
[:] [DEBUG] [2010-09-16 17:09:23] [           App::OnlineOrdering] -   UserPreference Columns (1.2ms)   SHOW FIELDS FROM `user_preferences`
=> [#<UserPreference id: 1, user_id: 16, item_results: 1, favorite_results: 2, recent_results: 2, created_at: "2010-09-15 15:13:04", updated_at: "2010-09-15 15:13:04">]
0 голосов
/ 15 сентября 2010

Вы определяете свои отношения таким образом, который я считаю не лучшим.Вы пытаетесь создать отношение «многие ко многим» между пользователями и предпочтениями (у пользователя много предпочтений, а предпочтение задается многими пользователями).Если вы хотите добавить дополнительные поля (в данном случае это значение) в отношение «многие ко многим», вы добавляете их в таблицу соединений (в данном случае это настройки пользователя).

Я заметил, что вы используете статические значениядля предпочтений и не хотите создавать модель для самих предпочтений (хотя это было бы удобно, если вы решили расширить пользовательские предпочтения в будущем).
Попробуйте следующие модели:

class User < AR::Base
  has_many :user_preferences

  def item_preference
    user_preferences.find_by_preference_id(1).value
  end
end

class UserPreference < AR::Base
  # has 3 fields: user_id, preference_id and value
  belongs_to :user
end

ЭтоКстати, вы можете найти предпочтения, выполнив user.item_preference или user.recent_preference.Если у вас появилось много предпочтений, это не будет оптимальным способом решения этой проблемы, но с этим вам придется столкнуться, когда придется.

Оптимально, у вас должна быть третья модель под названием «Предпочтения»и модель UserPreference будет действовать как объединение моделей предпочтений и пользователей.

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