如何为非ActiveRecord支持的类执行自动类型转换?

时间:2016-11-23 09:54:14

标签: ruby-on-rails activerecord types casting

我有一个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。我想,我需要在每个属性及其类型之间添加映射。

1 个答案:

答案 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