6

これを行う良い方法を見つけることができなかったので、質問したいと思いました。

たとえば、ActiveRecord モデルでは、データベースに基づく属性は、適切なデータベースに基づく型に自動的に型変換されます。私がCategoryモデルを持っていて、それがいくつかの属性を持っている場合、たとえばnamecategory_id、次のようにすると:

Category.new(params[:category])

Railsnameは、それが String でcategory_idあり、Integer であることを認識しています。

検証したいいくつかの一時的/合成属性があり、それらに特定のタイプがあるとします。それらをフォームから送信したいのですが、それらがどのように定義されているかに基づいて、文字列、整数、または日付 (たとえば) に自動的に変換されるようにしたいと考えています。

Rails モデルで次のように宣言するとします。

attr_accessor :some_number_variable
attr_accessor :some_date

Railsに「前者を整数にキャストし、後者を日付にキャストしてほしい」と伝える組み込みの方法はありますか?コントローラーに送信されたデータの一部である限り(私は実現しCategory.new(params[:category])ます日付の例は、多くの日付形式が存在することを考えると、少しトリッキーかもしれません)。params[:category][:some_number_variable]params[:category][:some_date]

4

6 に答える 6

1

attr_accesorリーダー/ライター メソッドを作成するだけで、Rails ではなくRubyから取得されます。よく混乱すると思われるRailsメソッドは、別の目的attr_accessibleを果たします。属性が読み取られたときにキャストしたい場合は、リーダーをオーバーライドするだけです。

attr_accessor :some_number_variable

def some_number_variable
  @some_number_variable.to_i
end

これにより、少なくとも無料でライターが提供されます。これは、あなたが説明しているもの(だと思います)について私が知っている最良の解決策です。

編集:検証に関する限り、Rails 3を使用している場合、これらの種類の属性の検証を実行する方がはるかに簡単になると思います(私はそれを行っていないので、確かなことは言えません) . バリデーションが ActiveRecord に直接関連付けられていないので、可能だと思います。

于 2011-03-28T18:34:57.423 に答える
0

どちらの回答も質問に完全には答えていません。質問に対する正解は単に「いいえ」だと思います。回答は両方とも、質問への回答が「いいえ」であるという事実に対する潜在的な回避策に対応しており、どちらも有効なコメント/アイデアです。

于 2011-03-31T00:12:23.577 に答える
0

以下をモデルに追加します。

columns_hash["birth_date"] = ActiveRecord::ConnectionAdapters::Column.new("birth_date", nil, "date")

参考:Rails ActiveRecord::MultiparameterAssignmentErrors

于 2012-12-30T21:41:29.047 に答える
0

before_createを使用します。

class Category
  attr_accessor :some_number_variable, :some_date
  before_create :validate

 private

   def validate
     return unless !!params[:category]
     #do variable casting here
   end
end
于 2012-01-08T04:30:17.397 に答える
0

「一時的/合成」属性とは、仮想属性を意味すると思いますか?

もしそうなら、これを行う組み込みのRails関数はありませんが、私が思いつきましたが、1つの解決策は、それらの属性のモジュールを作成してモデルに含めることです. または、動的にする必要がある場合は、属性を :some_variable_integer のように呼び出してから、それらの動的属性を method_missing で処理し、メソッド名を読み取り、必要な型に変換することができます。

私の意見では、これらは少し面倒なので、実行しようとしていることがサポートできる場合は、モデルの検証が本当に最善の策です。

于 2011-03-28T18:37:05.820 に答える