2016-11-23 7 views
1

UserActiveRecrodモデルと別のクラス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 /)クラスの型と値の強制を定義できる宝石 –

答えて

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

+0

提案をありがとう。これは素晴らしいことですが、まだ論理をinitializeメソッドからsetterメソッドに移動するだけです。私は[active_type](https://github.com/makandra/active_type)のようなものがあると思っていたが、Railsに組み込まれていた。 –

関連する問題