在活动记录中使用带有构造查询的Paginate

时间:2012-03-01 17:22:20

标签: ruby-on-rails ruby activerecord will-paginate

我正在尝试按以下方式做点什么:

if start_date?
  query = where("datetime > :start_date", :start_date => start_date)
end

if end_date?
  query = where("datetime <= :end_date", :end_date => end_date)
end

if client
  query = where("client.name LIKE :client", :client => client)
end

if staff
  query = where("staff.name LIKE :staff", :staff => staff)
end

paginate :per_page => 20, :page => page,
           :conditions => query,
           :order => 'datetime'

我找不到任何关于如何构建查询并将其与paginate插件一起使用的示例。当然查询不正确,因为我必须弄清楚如何进行连接,以便我可以查询其他表中的其他属性,但除此之外,如何构建查询以在条件中使用?

4 个答案:

答案 0 :(得分:4)

你想把.paginate调用放在调用链的末尾,就像这样(所有一行,为了便于阅读而分开)

SomeClass.where("datetime > :start_date", :start_date=>start_date).
  where("datetime < :end_date", :end_date=>end_date).
  paginate(:per_page=>20,:page=>page)

如果您想有条件地添加条件,您也可以这样做,例如:

x = SomeClass
x = x.where("datetime > :start_date", :start_date=>start_date) if start_date
x = x.where("datetime < :end_date", :end_date=>end_date) if end_date
x.paginate(:per_page=>20,:page=>page)

答案 1 :(得分:1)

如果你安装了 kaminari gem,你可以试试这个:

ModelName.where( your_query ).page(params[:page]).per(50)

答案 2 :(得分:0)

.where()返回ActiveRecord :: Relation

.paginate()的:conditions参数必须是一个条件数组,好像它是.where()的参数。

您应该将代码修改为下一个:

if start_date?
  query = ["datetime > :start_date", :start_date => start_date]
end

答案 3 :(得分:0)

ActiveRecord Relation 没有分页方法