Вопрос о will_paginate с несколькими условиями - PullRequest
1 голос
/ 25 марта 2011

В качестве заголовка я хочу установить несколько условий в will_paginate, это код моей модели

class Room < ActiveRecord::Base
  belongs_to :province
  belongs_to :city
  belongs_to :region
  belongs_to :street
  belongs_to :estate
  def self.search(city_id, region_id, layout, page)
    conditions = []
    conditions.push("city_id = #{city_id}")
    conditions.push("region_id = #{region_id}")
    conditions.push("layout = #{layout}") if layout!=0
    paginate :per_page => 5, :page => page,
      :conditions => conditions
  end
end

, введите его в контроллер:

@ rooms = Room.search (city, region, layout, params [: page])

но ... не работает правильно ... Просто рассмотрим первое условие.

, который может дать мне пример кода??Thx!

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

Лучшим подходом было бы использование таких условий (что предпочтительно в Rails)

class Room < ActiveRecord::Base
  belongs_to :province
  belongs_to :city
  belongs_to :region
  belongs_to :street
  belongs_to :estate
  def self.search(city_id, region_id, layout, page)
    conditions = {}
    conditions.merge!(:city_id => city_id)
    conditions.merge!(:region_id => region_id)
    conditions.merge!(:layout => layout) if layout!=0
    paginate :per_page => 5, :page => page,
      :conditions => conditions
  end
end

Это исключит риск внедрения SQL.

2 голосов
/ 25 марта 2011

Попробуйте это:

class Room < ActiveRecord::Base
  belongs_to :province
  belongs_to :city
  belongs_to :region
  belongs_to :street
  belongs_to :estate
  def self.search(city_id, region_id, layout, page)
    conditions = []
    conditions.push("city_id = #{city_id}")
    conditions.push("region_id = #{region_id}")
    conditions.push("layout = #{layout}") if layout!=0
    paginate :per_page => 5, :page => page,
      :conditions => conditions.join(' and ')
  end
end

Это объединит все ваши условия с "И".

Причина, по которой ваш код не работает, заключается в том, что при использовании массива для условия первым элементом должно быть условие с параметрами SQL, а остальные элементы - значениями параметров. Например:

Room.paginate(:conditions => ['city_id = ? and region_id = ?', city_id, region_id])

Вот почему он учитывает только первое условие.

...