我有一個模型方法,它有條件地連接用戶的用戶名(“登錄”)和真實姓名,如果他們保存了真實姓名 - 否則它只顯示用戶名。我想在 ActiveRecord 或 Arel 中重寫查詢。
看起來我應該使用Arel::Nodes::NamedFunction. 但我不明白如何使用命名函式進行條件連接。(Arel 知道“如果”嗎?我在檔案中找不到任何參考資料。)
def primer_values
connection.select_values(%(
SELECT CONCAT(users.login,
IF(users.name = "", "", CONCAT(" <", users.name, ">")))
FROM users
ORDER BY IF(last_login > CURRENT_TIMESTAMP - INTERVAL 1 MONTH,
last_login, NULL) DESC,
contribution DESC
LIMIT 1000
)).uniq.sort
end
ORDER BY 中也有類似的條件。
uj5u.com熱心網友回復:
雖然通常我討厭 Rails 中的 Raw 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 而不將其抽象為自己的物件會嚴重損害可讀性。
這么說只是為了給你一個想法;第一部分是 3NamedFunction秒
- 康卡特
- 如果
- 康卡特
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("'>'")]
)]
)]
)
ANamedFunction是一個建構式,FUNCTION_NAME(ARG1,ARG2,ARG3)因此任何使用此語法的 SQL 都可以使用NamedFunction包括空函式NOW()或其他語法(如LATERAL(query).
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436024.html
標籤:sql 轨道上的红宝石 活动记录 ruby-on-rails-5 雷尔
