1

很多时候,我遇到一种让我感到厌烦的情况,因为我觉得我的解决方案达不到标准。

假设我有一个用户模型。可以有两种类型的用户 - 管理员和普通用户。在这种特殊情况下,我只是将 User 和 Admin 拆分为单独的模型——这很公平。

在某些情况下,当同一模型有多种类型(Foo可以是绿色、红色、紫色、黄色等)时,我认为处理 10 个不同的模型(如 YellowFoo、GreenFoo 等)没有多大意义 - 所以我添加了一个“ type" 属性,然后将查找正确对象的代码简化为User.where(:type => "some_type").

这是在 Ruby on Rails 中可接受的做事方式吗?是否应该将类型设置为符号而不是字符串,以便User.where(:type => :some_type)看起来更漂亮,或者无论你怎么看,这都是一种黑客行为?

我创建的视图也是如此。在上面的例子中,有一个管理控制器,它有一个与用户完全分开的仪表板,尽管仪表板的代码或多或少是相同的,但有一些例外(但在未来,可能会有更多不同)。这是一种可接受的做事方式还是新的方式?

提前致谢!

4

2 回答 2

1

type属性足以在模型内部使用它来分隔不同类型的对象。但是typeRails AR 类方法使用的属性名称本身,所以我建议使用模型名称指定的字段类型名称,如User模型的 'user_type' 以避免冲突。

定义了模型的类型后,您可以添加非常方便的模型范围和方法。

例如:

class Order
  # I prefer to define type constants as camelized strings, but it would be probably 
  # better to use strings in downcase for localization purposes
  ORDER_TYPES = (OrderTypePersonal, OrderTypeOrganization = 'Personal', 'Organization')

  scope :personal,     where(order_type: OrderTypePersonal)
  scope :organization, where(order_type: OrderTypeOrganization)

  def personal?;    order_type == OrderTypePersonal     end
  def organization; order_type == OrderTypeOrganization end
end

# find all personal orders
personal_orders = Order.personal.all
# build new organization order
organization_order = Order.organization.new
# check order type
Order.find(14).personal?
# user order types as select
f.select :order_type, Order::ORDER_TYPES
于 2013-07-03T13:37:53.053 回答
1

我建议在我们的应用程序中针对不同类型/角色的用户,我们可以定义一个角色模型。

我们可以根据我们的要求定义为 User 和 Role 之间的关联。更基本的是,在角色模型中,我们将定义 has_many :users

在用户模型中,我们将定义 belongs_to :role

一个角色将有多个用户。我们可以检查用户模型中的每个用户角色

def has_role?(roleSymbol)    
  (role.role_name.underscore.humanize.downcase.to_sym == roleSymbol)? true :false
end

在这里,我们可以检查用户具有“管理员”或“普通”用户的角色。

对于视图部分,我们可以检查用户角色,并且可以为不同类型的用户包含单独的部分。

于 2013-07-03T07:51:02.477 回答