0

我试图从我的数据库中删除两个表。这些表是 message_sort_options 和 per_page_options。这些表基本上只有 5 条记录,这些记录是用户可以在首选项表中设置为他们的首选项的选项。首选项表具有诸如 sort_preferences 和 per_page_preference 之类的列,它们都指向包含选项的其他两个表中的记录。我如何设置具有虚拟属性和选项固定值的模型 - 每次查找首选项时都消除表查找?

4

2 回答 2

0

试试这个:

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
于 2010-03-25T20:44:02.907 回答
0

在目录中创建一个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)
于 2010-03-25T22:48:04.387 回答