有关多个条件的will_paginate的问题

时间:2011-03-25 15:08:35

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-plugins ruby-1.9 will-paginate

作为我的标题,我想在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 个答案:

答案 0 :(得分:3)

更好的方法是使用这样的条件(在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注入的风险。

答案 1 :(得分:2)

试试这个:

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

这会将所有条件与“AND”连接起来。

您的代码不起作用的原因是当您使用数组作为条件时,第一个元素应该是具有SQL参数和剩余元素的条件 - 是参数值。例如:

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

这就是为什么它只考虑第一个条件。