son*_*002 7 activerecord ruby-on-rails ruby-on-rails-3
我正在使用rails 3和postrges.
我希望按特定优先顺序排序.
就像是:
Assignment.order(priority: ['best', 'good', 'bad'])
Run Code Online (Sandbox Code Playgroud)
这将首先以"最佳",然后"好",然后"坏"返回所有活动记录
我似乎无法找到这样的东西.我不需要数组,它必须是activerecords.
小智 21
订单可以是任何SQL代码.您可以使用CASE语句将值映射到自然按正确顺序排序的值.
Assignment.order("
CASE
WHEN priority = 'best' THEN '1'
WHEN priority = 'good' THEN '2'
WHEN priority = 'bad' THEN '3'
END")
Run Code Online (Sandbox Code Playgroud)
更好的是,您可以将此逻辑移动到模型中,以便从控制器调用更容易:
class Assignment < ActiveRecord::Base
...
def self.priority_order
order("
CASE
WHEN priority = 'best' THEN '1'
WHEN priority = 'good' THEN '2'
WHEN priority = 'bad' THEN '3'
END")
end
end
Run Code Online (Sandbox Code Playgroud)
然后你可以打电话Assignment.priority_order来获取你的排序记录.
如果此列在视图中可排序,请向方向添加参数:
def self.priority_order(direction = "ASC")
# Prevent injection by making sure the direction is either ASC or DESC
direction = "ASC" unless direction.upcase.match(/\ADESC\Z/)
order("
CASE
WHEN priority = 'best' THEN '1'
WHEN priority = 'good' THEN '2'
WHEN priority = 'bad' THEN '3'
END #{direction}")
end
Run Code Online (Sandbox Code Playgroud)
然后,您将调用Assignment.priority_order(params[:direction])从控制器传递排序.
wnm*_*wnm 10
在较新版本的 Rails 中,ActiveRecord::UnknownAttributeReference (Query method called with non-attribute argument(s)如果将原始 SQL 传递给.order().
您需要用 包装您的 SQL 查询Arel.sql()。您还可以使用 ruby 的Here Doucment语法来编写多行 SQL 语句,并压缩以使其在控制台中更具可读性。
所以整个事情就变成了:
Assignment.order(
Arel.sql(<<-SQL.squish
CASE
WHEN priority = 'best' THEN '1'
WHEN priority = 'good' THEN '2'
WHEN priority = 'bad' THEN '3'
END
SQL
)
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4259 次 |
| 最近记录: |