我有一个关于ActiveRecord的问题,希望你们中的任何人都可以帮助我一点。在此先感谢:)。
我有一个ActiveRecord模型,它有一个布尔字段来指示用户是否接受了许可。我不想创建与之相关的数据库列,但我希望它使用ActiveRecord提供的所有验证内容和类型转换。网上有很多解决方案,但所有解决方案都专注于无表格模型(例如http://railscasts.com/episodes/193-tableless-model),而我的模型也有其他字段对应表格列。以下是我提出的建议:
class User < ActiveRecord::Base
include TablelessColumns
tableless_column :license_accepted, :boolean
# other fields that are corresponding to table columns
end
module TablelessColumns
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def tableless_columns
read_inheritable_attribute(:tableless_columns)
end
def tableless_column(name, sql_type = nil, default = nil, null = true)
write_inheritable_attribute(:tableless_columns, {}) if tableless_columns.nil?
tableless_columns[name] = ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
define_method("#{name.to_s}=".to_sym) { |value| instance_variable_set(to_variable(name), value) }
define_method(name) { self.class.tableless_columns[name].type_cast(instance_variable_get(to_variable(name))) }
end
end
def to_variable(sym)
"@#{sym.to_s}".to_sym
end
end
这个解决方案似乎相当冗长,我想知道那里是否有更好的解决方案。
答案 0 :(得分:3)
我想我在一些身份验证插件中看到了它,用于向模型发送密码确认而不将其保存到db,因此您只需添加到您的模型中:
attr_accessor :accepted_license
现在你可以将它与验证和表格一起使用。