検索したいモデル(以下の簡略版-完全なモデルにはさらに多くのフィールドがあります)があります。
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=✓&ref_code=111&title=test&subject=code&commit=Search
次に、コントローラーはMedia.search(params)を呼び出すだけで、適切なフィールドで適切な値を検索するスコープを返します。ご覧のとおり、使用してみましたが、これは実際のモデルクラスではなく、モデルのインスタンスrespond_to?
に対してのみ定義されており、モデルに関係のないパラメーターを無視するものが必要です(たとえば、utf8とこの場合はcommit)。これがすべてうまくいく場合は、コードをリファクタリングして、同じメソッドを複数のモデルで再利用できるようにする予定です。
に似たクラスメソッドはありrespond_to?
ますか?同じタスクをどのように実行しますか?
これはRails3でモデル属性を動的に取得することに関連していることは知っていますが、モデルのインスタンスではなくモデルで実行したいので、実際に実行しようとしていることに答えることはできません。