按数据库中的状态排序

时间:2011-01-26 08:08:14

标签: ruby-on-rails ruby database sorting

鉴于我有一个模型house,它存在于几个州,如下所示: Dreaming —> Planning —> Building —> Living —> Tearing down

如果我想要检索让我们说数据库中的十个房子并按州字段排序,我首先获得Building州的所有房屋,然后Dreaming,然后{{{ 1}},...

是否有可能从数据库中获取所有房屋并按照预定的顺序按州对其进行排序?意思是,首先是Living州的所有房屋,然后是Dreaming等。通过提供数组中的顺序来比较各种类型。

我想在获取所有条目之后避免在Ruby中执行此操作,并且我不想在状态中使用ID。

在阅读了枚举实现之后,我想,如果我能使它工作,我会尝试将enum column pluginstate_machine plugin结合起来,以实现我所追求的目标。如果有人之前做过这样的事情(尤其是Rails 3下的组合),我会很感激输入!

3 个答案:

答案 0 :(得分:3)

如果您使用的是MySQL,那么解决方案就是进行ORDER BY FIELD(州,'建筑','梦想','生活',......):

House.order("FIELD(state, 'Building', 'Dreaming', 'Living', ...)")

答案 1 :(得分:3)

以下是有关如何在rails中使用SQL ENUM的一些信息 - 它们是相对数据库可移植的,并且大致按照您的要求进行 - http://www.snowgiraffe.com/tech/311/enumeration-columns-with-rails/

答案 2 :(得分:2)

如果您想在某个标准后订购该集合,那么您必须将该标准存储在某处。

我不知道这是否符合您的“不在Ruby”标准,但我可能会这样做:

class House < ActiveRecord::Base
  STATES { 0 => "Dreaming",
           1 => "Planning",
           2 => "Building",
           3 => "Living",
           4 => "Tearing Down" }

  validates_inclusion_of :state, :in => STATES.keys

  def state_name
    STATES[self.state]
  end
end

@houses = House.order("state")

在这种情况下,db字段状态是整数而不是字符串。它使数据库存储和查询非常有效。

然后在您的视图中,调用state_name以从模型中存储的STATES哈希中获取正确的名称。这也可以通过在散列中使用标签而不是字符串来更改为使用i18n本地化。