2010-09-15 2 views
1

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

  1. пункта
  2. любимого
  3. последних.

Мне нужно, чтобы показать список результатов, устанавливается пользователем в течение, например, если на странице элемента пользователь хочет 20 результатов, которые будут показаны, то я хочу, чтобы установить prference идентификатор устанавливается в 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

ответ

0

я решил вопрос о моей .. Перед отправкой ответа, я должен сказать, каждый должен Рельсы пользователя консоли

меня определяют отношения следующим образом

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

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

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

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. Если вы начнете иметь много предпочтений, это не будет оптимальным способом для этого, но это то, с чем вам придется столкнуться, когда вам нужно.

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

+0

Как получить, что значение, заданное пользователем для страницы товара, любимой страницы или последней страницы – vasu

+0

В модели User я создал метод, который возвращает только предпочтение страницы страницы (уведомление find_by_preference_id (1)). Вы можете: 1) создать новый метод для каждого предпочтения. 2) Передайте предпочтение, которое вы хотите в качестве параметра для метода, чтобы вы делали что-то вроде 'user.preference (2)' – Faisal

Смежные вопросы