1

我将字符串变量存储在数据库中,“弃权”、“阻止”、“否”或“是”。目前我正在使用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 语句中使用的解决方案谢谢!

4

4 回答 4

7

这是做到这一点的方法之一。顺便说一句,做这种事情的最好方法是让另一个表命名"Position",通过一个数字和表中的外键来标识每个值,"votes"以引用表的主键"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

无论如何,如果它不能正常工作!你可以试试这个:

Select  *
    From    (
        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}
        )
    )   As  Result
    ORDER   BY  Position_Value
于 2012-09-11T04:52:39.200 回答
4

每当我有一个序列时,我需要按不自然的顺序排序,我会添加一个额外的整数字段,并将值放入其中,这将强制字符串值按我想要的任何顺序排列。

而不是只有:

'Abstain'
'Block'
'No'
'Yes'

我会有第二个字段:

'Abstain' 3
'Block'   1
'No'      2
'Yes'     4

对第二列进行排序允许我按我想要的顺序检索值:

'Block'   1
'No'      2
'Abstain' 3
'Yes'     4
于 2012-09-11T04:53:51.883 回答
2

如果这是永久性要求,您可以将它们存储在另一个表中,其中包含另一列“ordering”,其中包含按所需顺序打印它们的数字,将您的结果与该表连接并按排序列排序。

如果这是临时的,您可以将结果与UNION一堆 SQL 语句连接起来,这些语句选择值和排序,然后按排序列排序。

于 2012-09-11T04:51:39.687 回答
0

您可以定义类似 MySQL 的FIELD函数,即对数组进行索引查找,然后将其用于您的ORDER BY. 它比数组更简洁。

请参阅:https ://stackoverflow.com/a/12366184/398670

于 2012-09-11T09:10:46.850 回答