1

検索したいモデル(以下の簡略版-完全なモデルにはさらに多くのフィールドがあります)があります。

class Media < ActiveRecord::Base

  attr_accessible :subject, :title, :ref_code

  validates :title, :presence => true
  validates :subject, :presence => true

  def self.search(terms_hash)
    return if terms_hash.blank?

    composed_scope = self.scoped

    terms_hash.each_pair do |key, value|
    if self.respond_to? key and not value.is_blank?
      value.split(' ').each do |term|
        term = "%#{term}%"
        composed_scope = composed_scope.where("#{key} LIKE ?", term)
      end
    end
    composed_scope
  end
end

高度な検索フォームは、モデルのインスタンスの作成/更新に使用されるフォームとほぼ同じであるため、リクエストのパラメータリストを動的に調べ、名前を介してフォームフィールドをモデル属性に一致させるメソッドを作成したいと思います。したがって、検索リクエストがだった場合、

/search?utf8=✓&amp;ref_code=111&title=test&subject=code&commit=Search

次に、コントローラーはMedia.search(params)を呼び出すだけで、適切なフィールドで適切な値を検索するスコープを返します。ご覧のとおり、使用してみましたが、これは実際のモデルクラスではなく、モデルのインスタンスrespond_to?に対してのみ定義されており、モデルに関係のないパラメーターを無視するものが必要です(たとえば、utf8とこの場合はcommit)。これがすべてうまくいく場合は、コードをリファクタリングして、同じメソッドを複数のモデルで再利用できるようにする予定です。

に似たクラスメソッドはありrespond_to?ますか?同じタスクをどのように実行しますか?

これはRails3でモデル属性を動的に取得することに関連していることは知っていますが、モデルのインスタンスではなくモデルで実行したいので、実際に実行しようとしていることに答えることはできません。

4

1 に答える 1

5

ActiveRecordモデルクラスにはcolumnsメソッドがあるので、属性名のリストを簡単に取得できます。

names = Model.columns.map(&:name)

いくつかの一般的なものを簡単に削除できます。

names = Model.columns.map(&:name) - %w[id created_at updated_at]

classメソッドも興味深いかもしれません。これaccessible_attributesにより、に何が与えられたかがわかりますattr_accessible

于 2013-01-15T04:52:20.270 に答える