【问题标题】:Single-table inheritance in Rails - How can I get a record within my table to have multiple sub-types while still using single-table inheritance?Rails 中的单表继承 - 如何在仍然使用单表继承的同时让表中的记录具有多个子类型?
【发布时间】:2014-08-30 16:35:58
【问题描述】:

我试图在 Rails 中使用单表继承作为允许用户拥有多个用户子类型(例如,教师、供应商等)的一种方式。我最终得到了一个用户表,其中的记录只包含一个用户类型。在仍然使用单表继承的同时,如何让我的用户拥有多种类型? (我知道这本质上是一个多对多的关系;我只是不确定如何使用 STI 来实现这一点。)

id | first_name | last_name | birth_date | city | zip_code | email |  type   |         created_at         |         updated_at
----+------------+-----------+------------+------+----------+-------+---------+----------------------------+----------------------------
  1 | Akira      | Yamaoka   |            |      |          |       | Vendor  | 2014-08-30 14:58:26.917333 | 2014-08-30 14:58:26.917333
  2 | Pyramid    | Head      |            |      |          |       | Faculty | 2014-08-30 15:02:04.70209  | 2014-08-30 15:02:04.70209

这是我的模特的课程:

用户.rb

1 class User < ActiveRecord::Base
2 end

vendor.rb

  1 class Vendor < User
  2   belongs_to :user
  3   belongs_to :event
  4 end

faculty.rb

1 class Faculty < User
2   belongs_to :user
3   belongs_to :event
4
5 end

【问题讨论】:

  • 你为什么需要has_many :vendors以及UserVendorFaculty之间的所有这些关系?看起来有点奇怪。
  • 用于单表继承。
  • 这不是 STI,这是 STI 内部的一些奇怪的东西;)
  • 哎呀!也许你是对的。摆脱它。

标签: sql ruby-on-rails inheritance ruby-on-rails-4


【解决方案1】:

你可以这样写:

class User < ActiveRecord::Base
  belongs_to :event
end

class Vendor < User
end

class Faculty < User
end

然后通过User模型获取不同类型的记录,比如User.all

【讨论】:

  • 感谢您抽出宝贵时间回复,但此回复并未真正解决最初的问题,该问题涉及如何同时为单个模型提供多个子类型。你知道这是怎么做到的吗? (顺便说一句,我的模型类看起来与您发布的内容非常相似。我已经更新了原始帖子以包含它们。)
  • 我已经写过如何使用 STI 来查看您的模型,对于一个用户的多种类型呢?我不确定使用 STI 是否可以做到这一点,即使 type 可能类似于 @987654325 @,在这种情况下ActiveRecord应该如何选择你需要的哪一种类型?
【解决方案2】:

简短回答:不,你不能那样做,type 列只能保存一个值。

更长的答案: 多对多关系要求存在一个额外的模型(它必须存在,HABTM 在这里不会这样做),其中包含对 User 的引用和Event。我称它为Pass in this answer to your another question

你应该继承Pass,而不是User。由于User has_many :passes 可能是Pass 的子类,User 可以通过多种方式参与活动:作为供应商或作为教员。

我提供了一些示例代码here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多