Значения предпочтений - статические без таблиц с использованием модели с виртуальными атрибутами - PullRequest
0 голосов
/ 25 марта 2010

Я пытаюсь удалить две таблицы из моей базы данных. Это таблицы message_sort_options и per_page_options. Эти таблицы в основном содержат 5 записей, которые пользователь может установить в качестве предпочтения в таблице предпочтений. Таблица предпочтений имеет столбцы, такие как sort_preferences и per_page_preference, которые оба указывают на запись в двух других таблицах, содержащих параметры. Как я могу настроить модели с виртуальными атрибутами и фиксированными значениями для опций, исключая поиск таблиц при каждом поиске предпочтений?

Ответы [ 2 ]

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

Создайте файл app_config.yml в каталоге config.

page:
  small: 10
  medium: 20
  large: 30


sort:
  name: name DESC  
  amount: amount ASC
  date: created_at DESC  

Создать UserOptions класс в каталоге моделей.

class UserOptions
  def self.page_option key
    options['page'][key] rescue nil  
  end

  def self.sort_option key
    options['sort'][key] rescue nil
  end

  def self.options
    @options ||=  YAML.load_file( File.join(RAILS_ROOT, 
                    "config", "app_config.yml")) rescue {}
  end


  # use this in the view to set the preference
  def self.page_collection
    option_collection 'page'
  end

  # use this in the view to set the preference
  def self.sort_collection
    option_collection 'sort'
  end

  def self.option_collection key
    (options[key]|| {}).to_a
  end
end

Настройте ваши модели:

class User
  has_one :preference
end

class Preference

  def sort_preference(default = nil)
    UserOptions.sort_option(attributes['sort_preference']) || default
  end

  def per_page_preference(default = nil)
    UserOptions.page_option(attributes['per_page_preference']) || default
  end

end

Теперь вы можете делать следующее:

current_user.preference.per_page_preference

# use 10 as the page size if no value is given
current_user.preference.per_page_preference(10)
0 голосов
/ 25 марта 2010

Попробуйте это:

class MessageSortOption

  def self.get_cached_option(id)
    # store the hash of the options in a class variable
    (@@option_cache ||= Hash[ *all.collect{|o| [o.id, o]}.flatten])[id]
  end

end

class PerPageOption

  def self.get_cached_option(id)
    # store the hash of the options in a class variable
    (@@option_cache ||= Hash[ *all.collect{|o| [o.id, o]}.flatten])[id]
  end
end

class User
  has_one :preference
end


class Preference

  def sort_preference
    MessageSortOption.get_cached_option(attributes['sort_preference'])
  end

  def per_page_preference
    PerPageOption.get_cached_option(attributes['per_page_preference'])
  end

end

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

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