2016-11-23 21 views
1

我有一個ActiveRecrod模型User和一個單獨的類UsersFilter,它是完全用於過濾模型。假設UsersFilter接受參數散列params = {min_age: '18', max_age: '30', admin: 'true'}。所有的值都是字符串。如果我直接將這些值傳遞給ActiveRecord,則查詢將起作用。但是,我也希望能夠在我的代碼中使用這些值,以便可以圍繞它創建一些邏輯。所以爲了做到這一點,我需要手動輸入這些值。所以UsersFilter可能是這樣的:如何爲非ActiveRecord支持的類執行自動類型轉換?

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 

所以我的問題是 - 有一個導軌模塊,我可以按順序自動出現有這樣的類型轉換拌入?

P.S.我想,我需要在每個屬性和它的類型之間添加一個映射。

+1

我不確定是否有任何Rails模塊可以混合使用(Rails 4.2及以下版本中沒有),但可以查看[dry-types](http:// dry-rb。 org/gems/dry-types /)允許爲類定義類型和值強制的gem –

回答

1

使用自定義setter方法:

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

+0

感謝您的建議。這是一個很好的方法,但仍然 - 它只是將邏輯從initialize方法移動到setter方法。我希望有一些像[active_type](https://github.com/makandra/active_type),但內置於Rails。 –

相關問題