实际上,如果我必须处理 8 到 10 个属性,我会这样做。但是,如果您的 Profile 模型类的属性太多,并且具有基于用户组、公共、共享等显示这些属性的复杂逻辑,那么我鼓励您将其移至单独的模型类,比方说:“ProfileConfiguration 或 ProfileSetting”,它将在行级别上维护每个属性,或者您可以将这些设置移动到 Redis,其中的结构将类似于:user_id: {attribute_name: true, type: 'type_name'} 但有一个缺点您将取决于 Redis 服务器的可用性。
现在,在你的情况下:
serialize :profile_preferences, Hash
然后你用它来维护它(正如你提到的,只是以与他们的任务相反的方式):
{email: false, address: false, age: true }
但是,您可以继续创建一些方便的方法来调用您的配置文件对象:
after_initialize :load_profile_preferences
private
def load_profile_preferences
profile_preferences.each do |attr, value|
self.class.send(:define_method, "show_#{attr.to_s}?") { value }
end
end
现在,您可以在 Profile 类的对象上获得方便的方法,例如:show_email?、show_address? 和 show_age?,您可以通过 delegate 到 User 类实例。因此,您现在可以在视图中执行类似的操作,例如:
<%= "Email: {user.email}" if user.show_email? %>
<%= "Address: {user.address}" if user.show_address? %>
<%= "Age: {user.age}" if user.show_age? %>