鉴于这种用法,我通常讨厌rails中的原始SQL,但我还是保持原样。虽然我可能会把它改成更地道的东西,比如。
User
.order(
Arel.sql("IF(last_login > CURRENT_TIMESTAMP - INTERVAL 1 MONTH,last_login, NULL)").desc,
User.arel_table[:contribution].desc)
.limit(1000)
.pluck(Arel.sql(
'CONCAT(users.login,
IF(users.name = "", "",
CONCAT(" <", users.name, ">")))'))
.uniq.sort
将其转换为Arel而不将其抽象为自己的对象将严重损害可读性。
这只是为了给你一个想法;第一部分是3
NamedFunction
s
-
海螺
-
如果
-
海螺
Arel::Nodes::NamedFuction.new(
"CONCAT",
[User.arel_table[:name],
Arel::Nodes::NamedFuction.new(
"IF",
[User.arel_table[:name].eq(''),
Arel.sql("''"),
Arel::Nodes::NamedFuction.new(
"CONCAT",
[Arel.sql("' <'"),
User.arel_table[:name],
Arel.sql("'>'")]
)]
)]
)
A.
命名函数
是的构造函数
FUNCTION_NAME(ARG1,ARG2,ARG3)
因此,任何使用这种语法的SQL都可以使用
命名函数
NOW()
或者其他语法,比如
LATERAL(query)
.