だから私は動的にフィルターパラメータをwhereメソッドに渡したいので基本的にこれを持っています
@colleges = College.where(@filter).order(@sort_by).paginate(:page => params[:page], :per_page => 20)
そして、@ whereは、このメソッドで作成された文字列です。
def get_filter_parameters
if params[:action] == 'index'
table = 'colleges'
columns = College.column_names
else
table = 'housings'
columns = Housing.column_names
end
filters = params.except(:controller, :action, :id, :sort_by, :order, :page, :college_id)
filter_keys = columns & filters.keys
@filter = ""
first = true
if filter_keys
filter_keys.each do |f|
if first
@filter << "#{table}.#{f} = '#{filters[f]}'"
first = false
else
@filter << " AND #{table}.#{f} = '#{filters[f]}'"
end
end
else
@filter = "1=1"
end
問題は、生のSQLをそのようなwhereメソッドにドロップすることがどれほど優れているかわからないことです。通常、:state =>'PA'のようなことができることは知っていますが、それを動的に行うにはどうすればよいですか?
アップデート
さて、私は今ハッシュを渡してこれを持っています:
if params[:action] == 'index'
columns = College.column_names
else
columns = Housing.column_names
end
filters = params.except(:controller, :action, :id, :sort_by, :order, :page, :college_id)
filter_keys = columns & filters.keys
@filter = {}
if filter_keys
filter_keys.each do |f|
@filter[f] = filters[f]
end
end
それは注射から保護するのに十分でしょうか?