【问题标题】:Separate Users Across 2 Tables?跨 2 个表分隔用户?
【发布时间】:2014-12-16 09:55:07
【问题描述】:

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

  • 买家
  • 卖家

目前有人在用户表下构建了数据库:

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

我需要为卖家保留一些额外的数据,还有一些我希望卖家可以访问的功能/页面,但不是买家

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

  • 帐号
  • 排序代码

我们不需要为买家存储这些数据,因为他们使用 Stripe 进行付款。

我们是否包含当前用户表中的数据?还是我们创建一个链接到用户表的新 Sellers 表?

【问题讨论】:

  • 不知道原代码的作者为什么不使用单表继承,而是手动执行...
  • 我不确定,你会推荐什么?我猜使用单表继承。该人是否有任何理由不使用它?感谢您的输入@D-side

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


【解决方案1】:

您可以使用一张桌子并在模型中有所不同。作为用户,他们将共享许多共同特征,例如登录时的身份验证,更改密码等。

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

【讨论】:

  • 好的,所以我可以为每种类型的用户类存储特定的方法。我是否也可以在这些方法中存储银行详细信息,这是否比将这些详细信息存储在数据库中更好?在我看来,如果需要,可以在数据库中查询这些详细信息。感谢您的意见@roob 期待听到您的想法。 :)
  • 关于银行详细信息,我会将其单独存储,因为我希望我的用户(尤其是买家)拥有多个银行账户 :-),除非您不允许存储他们的银行详细信息.. .
  • 我们不存储通过 Stripe(类似于 Paypal)的买家银行详细信息。我们需要为卖家存储银行详细信息,以便我们可以为他们出售的商品付款。目前,我们会在一段时间内保留付款,以确保买家安全交易商品。因此,我们为卖家存储银行详细信息,以便以后手动支付这笔钱。我们将在未来将这一切自动化。感谢@Roob 很棒的输入:)
【解决方案2】:

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

排除差异(银行详细信息?)分成单独的模型,与User具有一对一关系

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

Single Table Inheritance

  • 将字符串列 user_type 更改为 type,然后再制作两个模型没有表格 (--no-migration),不是从 ActiveRecord::Base 继承,而是从 User ,所以他们继承它的表以保持持久性
  • 您的users 表需要包含来自所有子类的所有列
  • 任何User 子类(如Buyer)都将被定义为带有某些type"Buyer")的User

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

  • 您需要为所需的每个序列化属性集合创建一个text-type 列
  • 您将只受序列化程序格式的限制,不受数据库列和类型的限制,它允许您在其中存储任意数据
  • You can define a custom serializer 输出自定义对象(甚至可能是模型?)
  • 要格外小心,不要让用户任意编辑集合
  • 确保您只需要来自已加载对象的序列化数据,相反是设计缺陷

【讨论】:

  • 快速问题@D-side 仍然不是 100% 清楚“排序代码”和“帐号”两列将如何存储。比如单表继承,数据实际存放在哪里?排除差异并将它们放在单独的模型中是有道理的,但确定这将是 0..1 关系吗?并非每个用户都有卖方银行详细信息模型。谢谢! :)
  • 1) 它存储在users。即使只有一个子类需要它们,整个表也需要它们。 2) 一对一表示可能性。关联可能不存在。
  • 好的,为了澄清,我在users 表中添加了两个新列。这些列是seller 模型中的account_nosort_code. I then specify the subclass seller`。我猜只有sellersubclass 是有意义的,这是因为sellers 可能想买东西,实际上可能是sellersbuyers。谢谢@D-side,你帮了很多忙:)
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2017-06-28
  • 2017-07-21
相关资源
最近更新 更多