Dav*_*e G 3 sql ruby-on-rails will-paginate
我称之为一个非常简单的功能,似乎无法弄清楚最新情况.(我使用rails 3.0.3和'will_paginate'gem的主分支).我有以下代码:
results = Article.search(params) # returns an array of articles
@search_results = results.paginate :page => params[:page], :per_page=>8, :order => order_clause
Run Code Online (Sandbox Code Playgroud)
无论我使用order_clause(例如'article_title desc'和'article_title asc'),结果总是以相同的顺序相同.因此,当我检查使用类似的东西时@search_results[0],元素总是相同的.在我看来,它们显然总是一样的.我完全错过了什么吗?
我确定它有点傻,但我整晚都在撞墙.任何帮助将非常感激!
编辑为添加:搜索子句执行以下操作:
def self.search(params)
full_text_search(params[:query].to_s).
category_search(params[:article_category].blank? ? '' : params[:article_category][:name]).
payout_search(params[:payout_direction], params[:payout_value]).
length_search(params[:length_direction], params[:length_value]).
pending.
distinct.
all
end
Run Code Online (Sandbox Code Playgroud)
其中每个人都是基于searchlogic的函数,如下所示:
#scopes
scope :text_search, lambda {|query|
{
:joins => "INNER JOIN users ON users.id IN (articles.writer_id, articles.buyer_id)",
:conditions => ["(articles.article_title LIKE :query) OR
(articles.description LIKE :query) OR
(users.first_name LIKE :query) OR
(users.last_name LIKE :query)", { :query => "%#{query}%" }]
}
}
scope :distinct, :select => "distinct articles.*"
#methods
def self.payout_search(dir, val)
return no_op if val.blank?
send("payment_amount_#{dir.gsub(/\s+/,'').underscore}", val)
end
def self.length_search(dir, val)
return no_op if val.blank?
send("min_words_#{dir.gsub(/\s+/,'').underscore}", val)
end
Run Code Online (Sandbox Code Playgroud)
谢谢.
如果你看一下will_paginate github页面中的例子,你可以发现他们使用:order子句和你的子句之间的一个重要区别:
@posts = Post.paginate :page => params[:page], :order => 'created_at DESC'
Run Code Online (Sandbox Code Playgroud)
这会在Post对象上调用paginate(没有选择任何对象 - 在paginate出现之前没有执行任何SQL).这在您的示例中是不同的:因为您在第一行代码中声明"返回一个文章数组 ".我能想出的最简单的问题是
results = Model.limit(5).all
@results = results.paginate :order => :doesnt_matter_anymore
Run Code Online (Sandbox Code Playgroud)
不会排序,但这会:
results = Model.limit(5)
@results = results.paginate :order => :matters
Run Code Online (Sandbox Code Playgroud)
只需all从搜索方法中取出就足够了.它使ActiveRecord在调用此方法时实际执行SQL查询.Will_paginate会在你打电话时为你做这件事paginate(如果你让它......).在这篇文章中查看有关Active Record Query Interface 3.0的延迟加载部分
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |