我有一个ActiveRecrod
模型User
和一个单独的类UsersFilter
,它仅用于过滤模型。假设UsersFilter
接受参数hash params = {min_age: '18', max_age: '30', admin: 'true'}
。所有值都是字符串。如果我将这些值直接传递给ActiveRecord
,则查询将起作用。但是,我也希望能够在我的代码中使用这些值,以便我可以围绕它构建一些逻辑。所以为了做到这一点,我需要手动输入这些值。所以UsersFilter
可能如下所示:
class UsersFilter
include ActiveRecord::AttributeAssignment
attr_accessor :min_age, :max_age, :admin
def initialize(params)
params[:min_age] = params[:min_age].to_i
params[:max_age] = params[:min_age].to_i
params[:admin] = ActiveRecord::Type::Boolean.new.type_cast_from_user(params[:admin])
assign_attributes(params)
end
# some query methods
end
所以我的问题是 - 是否有一个我可以混合的rails模块,以便自动进行这种类型转换?
P.S。我想,我需要在每个属性及其类型之间添加映射。
答案 0 :(得分:1)
使用自定义设置器:
class UsersFilter
include ActiveModel::Model
def min_age=(age)
self[:min_age] = age.to_i
end
def max_age=(age)
self[:max_age] = age.to_i
end
def admin(val)
self[:admin] = ActiveRecord::Type::Boolean.new.type_cast_from_user(val)
end
end
如果你真的需要将它干燥到一个通用的类型转换工具,你可以使用define_method
来进行元编程。但是YAGNI。