2

URLで指定された条件で、データベースからレコードのページ分割されたリストを取得しようとしています。

例: URL が次のようなものである場合: ?name=Michael&age=20 20 歳のすべてのマイケルを表示する必要があります。

しかし、url が のような場合&age=20、20 歳のすべての人を表示し、「name」パラメーターを無視する必要があります。

1ページに2つのリストをページ付けしています。どちらも同じモデルから来ており、位置だけが異なるため、コントローラーで2つのページ付けが定義されています:

@boss = Person.paginate(:page => params[:boss_page], :conditions => "position = 1")
@manager = Person.paginate(:page => params[:manager_page], :conditons => "position = 2")

パラメータが存在する場合にのみURLから条件を追加する方法は?

私はこのようにしようとしていました:

conditions = []
conditions << [ "age = ?", params[:age] ] if params[:age].present?

しかし、URLにparamを渡すとエラーが発生します:

undefined method `%' for ["age = ? ", "1"]:Array

次の質問は、この配列の条件を条件「位置 = 1」とマージする方法です。

更新:条件を使用してページネーションを行う方法を理解していますが、GETパラメーターに基づいて条件を指定するための最良のアイデアがわかりません。私はいつもこのようにすることができました:

if params[:age].present?
@boss = version with age conditons
else if params[:age].present? and params[:name].present?
@boss = version with age and name
else if params[:name].preset?
@boss = version with name only

しかし、レールではもっと簡単にできると思います。

4

3 に答える 3

4

最初のオプション: 渡されたパラメーターに基づいて条件を手動で接着し、渡されたパラメーターが空でない場合に where を追加するカスタムの名前付きスコープを作成できます (1 つの古いプロジェクトの例):

# custom scope in model
# call in controller by Model.email_contains(params[:email])
def self.email_contains(searched_email)
  if(searched_email.blank?)
    all # scoped
  else
    where(:email => searched_email)
  end
end

2 番目のオプションは、ransack (またはその前身である meta_search) を使用するだけです: https://github.com/ernie/ransack

于 2012-07-31T12:58:14.687 に答える
0
@boss = Person.where(:position => 1).paginate(:page => params[:boss_page])
@manager = Post.where(:position => 2).paginate(:page => params[:manager_page])
于 2012-07-30T09:35:35.497 に答える
-3

最後に、別のより簡単な方法でそれを行いました:

@p = Person.scoped
@p = @p.where(:age => params[:age]) if params[:age].present?
@p = @p.where(:name => params[:name]) if params[:name].present?

@boss = @p.paginate(:page => params[:boss_page], :conditions => "position = 1")
@manager = @p.paginate(:page => params[:manager_page], :conditons => "position = 2")

そして、それは魅力のように機能します。

于 2012-07-31T15:44:08.843 に答える