在轨道中处理各种模型状态的可用方法有哪些

时间:2015-05-26 14:11:21

标签: ruby-on-rails ruby

我正在使用RoR构建一个Web应用程序,它有各种模型。每个模型都有各种状态,例如:

用户 - 由管理员批准,由政府批准,拒绝,暂停,列入黑名单,所有者,租客

列车,隐藏,批准,拒绝,暂停。

我想知道处理各种状态的最佳方法是什么,其中一些状态是相互排斥的,有些状态可以共存。

我知道我们可以使用'state_machine'gem。但我想知道是否有任何行业最佳实践。

由于

2 个答案:

答案 0 :(得分:2)

  

我想知道处理各种状态的最佳方法是什么   有些州是相互排斥的,有些州可以共存。

如果出现这种情况,请考虑以具有多个状态列的方式构建模型。即在您的示例中,我可以想到用户 (由管理员批准,政府批准,拒绝,暂停,列入黑名单)和类型(所有者,租客)。

关于管理状态和州之间的不同转换,我建议您查看workflow gem。非常灵活,清洁和智能的管理状态方法。

答案 1 :(得分:1)

我同意@thaold关于用户状态和类型之间的区别。小心地将实际上彼此独立的属性混合在一起(共存是一个警告标志) - 以后很难将它们解开,特别是当它们被一起编入一个列表时。

如果您不需要/想要一个完整的状态机gem,我通常将它们作为常量放在模块中。

class User
  module State
    APPROVED_BY_ADMIN      = 'approved_by_admin'.freeze
    APPROVED_BY_GOVERNMENT = 'approved_by_government'.freeze
    # ...
  end

  module LivingSituation
    OWNER  = 'owner'.freeze
    RENTER = 'renter'.freeze
  end
end

class Car
  module State
    LISTED = 'listed'.freeze
    # ...
  end
end

如果您希望轻松复制Car::State.constants等状态机库的某些部分,则对它们进行封装后,可以在Car#listed?上进行元编程。