0

Railcasts のある特定のエピソードで、Ryan は高度な検索について話し、検索の条件を見つけるためにいくつかのコードを使用しています。その働きは説明されていないので、私はそれについて明確にしたいと思っていました。

def products
 @products ||= find_products
end

private

def find_products
 Product.find(:all, :conditions => conditions)
end

def keyword_conditions
["products.name LIKE ?", "%#{keywords}%"] unless keywords.blank?
end

def minimum_price_conditions
 ["products.price >= ?", minimum_price] unless minimum_price.blank?
end

def maximum_price_conditions
 ["products.price <= ?", maximum_price] unless maximum_price.blank?
end

def category_conditions
 ["products.category_id = ?", category_id] unless category_id.blank?
end

def conditions
 [conditions_clauses.join(' AND '), *conditions_options]
end

def conditions_clauses
 conditions_parts.map { |condition| condition.first }
end

def conditions_options
 conditions_parts.map { |condition| condition[1..-1] }.flatten
end

def conditions_parts
 private_methods(false).grep(/_conditions$/).map { |m| send(m) }.compact
end

これがどのように機能するか、特に彼がproducts.nameなどと呼んでいるように、メソッドproductsについての情報を歓迎します.

4

1 に答える 1

1

彼は検索フォームで条件のいくつかのメソッドを定義しています:keyword_conditionsminimum_price_conditionsansなど。テーブルproducts.nameのフィールドを意味します。nameproducts

方法

def conditions_parts
  private_methods(false).grep(/_conditions$/).map { |m| send(m) }.compact
end

_conditionsリフレクションを使用して、 (The regex )で終わる名前を持ち、()/_conditions$/を返さないメソッドのみを結合するこのクラスのプライベートメソッドを調べます。nullcompact

方法

def conditions
  [conditions_clauses.join(' AND '), *conditions_options]
end

AND条件の間にキーワードを追加しProduct.find、SQLクエリを作成して結果セットを返す結果を渡します。

于 2010-07-09T07:21:13.760 に答える