两个表中的用户分开?

时间:2014-12-16 09:55:07

标签: mysql sql ruby-on-rails ruby database

我正在构建一个Ruby on Rails应用程序,我正在分离两组用户:

  • 买家
  • 卖家

目前有人在Users表下使用以下内容构建数据库:

t.string "user_type",    default: "buyer", null: false

我需要为卖家提供一些其他数据,还有一些我希望卖家可以访问的功能/页面,但不是买家

例如,我想保留银行详细信息,以便我可以向卖家支付买家支付的费用(我们会保留几天的付款以确保安全交易)。所以附加数据可能是:

  • 帐号
  • 排序代码

我们无需为买家存储此数据,因为他们使用Stripe付款。

我们是否在当前用户表中包含数据?或者我们是否创建了一个链接到Users表的新卖家表?

2 个答案:

答案 0 :(得分:2)

您可以使用一张桌子并在模型中有所不同。作为用户,他们将分享许多共同的功能,例如sign_in期间的身份验证,更改密码等

class User < ActiveRecord::Base
  ...
end

class Buyer < User
  def buyer_specific_method_one
    ...
  end
end

class Seller < User
  def seller_specific_method_one
    ...
  end
end 

并将名为“type”的字符串字段添加到用户表中。请参阅Single Table Inheritance

答案 1 :(得分:0)

您可以使用多种选项。不一定是一种,有些组合是可能的:

将差异(银行明细?)分解为单独的模型User的一对一关系

  • 如果您需要,您可以将它们制作一个,一个卖方可以为多个银行提供信息
  • 您不会同时限制您的用户同时为买家和卖家(如果您愿意)
  • 如果每次请求都不需要这些详细信息,则性能损失不会太大

Single Table Inheritance

  • 将字符串列user_type更改为type,然后再创建另外两个模型而不使用表格--no-migration),而不是继承{{1} },但是来自ActiveRecord::Base,所以他们继承了持久性的表
  • 您的User表需要包含所有子类的所有列
  • 任何users子类(如User)都将被定义为具有特定BuyerUser
  • type

Serialize attributes您将仅在应用级别处理,而不是在数据库中处理

  • 您需要为所需的每个序列化属性集合创建一个"Buyer" - 类型列
  • 您只受限于序列化程序的格式,而不受数据库列和类型的限制,它允许您存储任意数据
  • You can define a custom serializer输出自定义对象(甚至是模型?)
  • 要特别注意不要让用户随意编辑馆藏
  • 确保您只需要已经加载的对象的序列化数据,相反的是设计缺陷