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