Ruby on rails 在数据库中按状态排序

Ruby on rails 在数据库中按状态排序,ruby-on-rails,ruby,database,sorting,Ruby On Rails,Ruby,Database,Sorting,假设我有一个模型房子,它生活在几个州,类似这样: 梦想->规划->建筑->居住->拆除 如果我想从数据库中检索十栋房子,并按状态字段进行排序,我会首先获取建筑状态中的所有房子,然后是梦想,然后是生活 是否可以从数据库中获取所有房屋,并在检索之前按照预定顺序按州对其进行排序?也就是说,首先是处于梦想状态的所有房屋,然后是规划,等等。例如,通过在数组中提供排序以进行排序比较 在获取了所有条目之后,我希望避免在Ruby中这样做,因为我不想对状态使用ID 在阅读了enum实现之后,我想,若我能让它工作起

假设我有一个模型
房子
,它生活在几个州,类似这样:
梦想->规划->建筑->居住->拆除

如果我想从数据库中检索十栋房子,并按状态字段进行排序,我会首先获取
建筑
状态中的所有房子,然后是
梦想
,然后是
生活

是否可以从数据库中获取所有房屋,并在检索之前按照预定顺序按州对其进行排序?也就是说,首先是处于
梦想
状态的所有房屋,然后是
规划
,等等。例如,通过在数组中提供排序以进行排序比较

在获取了所有条目之后,我希望避免在Ruby中这样做,因为我不想对状态使用ID


在阅读了enum实现之后,我想,若我能让它工作起来,我会尝试将和结合起来,以实现我所追求的目标。如果有人以前做过类似的事情(特别是Rails 3下的组合),我将非常感谢您的支持

如果您使用的是MySQL,那么解决方案就是按状态(state,'Building','Dreaming','Living',…)排序:


如果要按照特定条件对集合进行排序,则必须将该条件存储在某个位置

我不知道这是否违背了您的“不使用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")
class House“梦想”,
1=>“规划”,
2=>“建筑”,
3=>“生活”,
4=>“拆卸”}
验证:state,:in=>STATES.keys的包含
def state_名称
状态[自我状态]
结束
结束
@房屋=房屋秩序(“州”)
在这种情况下,db字段状态是整数而不是字符串。这使得它对于数据库存储和查询都非常有效


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

这里有一些关于如何在rails中使用SQL枚举的信息——它们相对来说是数据库可移植的,大致可以做您想要做的事情——

谢谢!没有一种独立于数据库的方法来使用这个函数,是吗?好吧,你可以用case/when/else来代替它-它在MySQL和Postrgesql中都能工作,谢谢你的回答。这就是我所说的字段ID。我希望能够使用状态名称作为字符串用于此目的。没问题。我只是想问,为什么需要使用字符串?还有其他应用程序使用相同的数据库吗?实际上,这个字段可能会被某种状态机使用,我只想让代码尽可能简单。在这种情况下,有了这个抽象层肯定会对我有所帮助,但我感觉它会给其他情况带来问题和可能的bug。-你认为呢?事实上,我认为我的解决方案非常适合状态机场景。像下一个州;状态[self.state+1];最后仅举一个例子。但是如果你认为它太复杂了,那么你就不应该这么做。据我所知,enum_列插件是按照你的建议做的,只是屏蔽了“ID”。所以,再次感谢+1,我想我可能会采用混合方法。这看起来确实很有趣!谢谢。我得承认我不知道枚举类型。快速查找发现:-您是否有使用这两个库的经验?排序真的像预期的那样工作吗?我想我将使用混合方法,并尝试使用enum_列插件。
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")