【发布时间】:2020-12-28 11:56:06
【问题描述】:
我正在尝试重构一段代码(也为了提高我对Arel::Nodes::Case 的理解),我想转换这个Arel.sql 语句
Arel.sql(default_order)
def default_order
"CASE
WHEN applications.status = 'new' AND owner_id IS NULL THEN '1'
WHEN applications.is_priority = '1' AND is_read = '0' AND owner_id = '#{current_user.id}' THEN '2'
WHEN applications.is_priority = '1' THEN '3'
ELSE '4'
END, applications.code"
end
进入Arel::Nodes::Case,但我没有得到任何好的结果。有什么可以提供帮助的想法吗?
非常感谢。
更新
我采用了这种方法,但我一点也不喜欢它。太难阅读和理解:
def default_order
arel_applications = Application.arel_table
Arel::Nodes::Case.new
.when((arel_applications[:status].eq('new'))
.and(arel_applications[:owner_id].eq(nil)), 1)
.when((arel_applications[:is_priority].eq(1))
.and(arel_applications[:is_read].eq(0))
.and(arel_applications[:owner_id].eq(current_user.id)), 2)
.when(arel_applications[:is_priority].eq(1), 3)
.else(4).to_sql
end
即便如此,我不知道如何获取在 SQL 中用于对记录进行排序的 applications.code。
【问题讨论】:
-
我想这回答了你的问题stackoverflow.com/a/60413416/493321
-
谢谢 Anuj,我尝试了类似的东西,但我不喜欢我得到的东西。我将用我得到的方法更新我的帖子。读起来太难太丑了
标签: ruby-on-rails ruby arel