我将字符串变量存储在数据库中,“Abstain”,“Block”,“No”或“Yes”。目前我正在使用ORDER BY position
来抓取这些,但是,我想按顺序排列它们:'阻止','不','弃权','是'。在Rails中有一种简单的方法吗?
我的确切代码是:
def self.unique_votes(motion)
Vote.find_by_sql("SELECT * FROM votes a WHERE created_at = (SELECT MAX(created_at) as created_at FROM votes b WHERE a.user_id = b.user_id AND motion_id = #{motion.id}) ORDER BY a.position")
end
注意:我正在使用Postgres SQL,我正在寻找一个可以在select语句中使用的解决方案谢谢!
答案 0 :(得分:7)
这是实现这一目标的方法之一。顺便说一句,执行此类操作的最佳方法是使用另一个名为"Position"
的表,该表通过"votes"
表中的数字和外键标识每个值,以引用{{{}的主键。 1}}表。您还可以在"Position"
表中使用另一个名为"Order"
的列来存储这些数字并进行排序。你应该在插入时间内做这些事情,而不是每次选择。
干杯
"Position"
任何方式,如果它不能正常工作!你可以尝试这个:
SELECT *
, Case a.position
When 'Block' Then 0
When 'No' Then 1
When 'Abstain' Then 2
When 'Yes' Then 3
Else -1
End As Position_Value
FROM votes a
WHERE created_at = (
SELECT MAX(created_at) as created_at
FROM votes b
WHERE a.user_id = b.user_id
AND motion_id = #{motion.id}
)
ORDER BY Position_Value
答案 1 :(得分:4)
每当我有一个系列我需要排序成一个不自然的顺序时,我会添加一个额外的整数字段,并将值放入其中,这将强制字符串值为我想要的任何顺序。
而不仅仅是:
'Abstain'
'Block'
'No'
'Yes'
我有第二个字段:
'Abstain' 3
'Block' 1
'No' 2
'Yes' 4
第二列的排序允许我按照我想要的顺序检索值:
'Block' 1
'No' 2
'Abstain' 3
'Yes' 4
答案 2 :(得分:2)
如果这是永久性要求,您可以将它们存储在另一个表中,其中包含另一个“排序”列,其中包含要按所需顺序打印它们的数字,使用此表加入结果并按订购列加入ORDER BY。
如果这是一个临时的,您可以将结果与UNION
一堆SQL语句结合起来,这些SQL语句选择值和顺序,然后按排序列排序。
答案 3 :(得分:0)
您可以定义MySQL的FIELD
函数,即对数组进行索引查找,然后将其用于ORDER BY
。它比数组更简洁。