Ruby on rails 我需要帮助正确建立这个ActiveRecord协会

Ruby on rails 我需要帮助正确建立这个ActiveRecord协会,ruby-on-rails,database,activerecord,rails-activerecord,Ruby On Rails,Database,Activerecord,Rails Activerecord,基本上,用户可以作为(或可能同时作为)供应商和活动教员的成员参与一个或多个活动 默认情况下,用户既不是供应商,也不是教员,而是在事件上下文中达到(或同时达到)一个(或两个)状态(例如,用户已作为其教员的成员被允许参加事件) 似乎我想说的是,用户通过供应商或教员链接表(或两者)拥有许多事件,但我不确定是否会在Rails模型中表示这些事件。以下是我迄今为止所尝试的: class User < ActiveRecord::Base has_many :events through =>

基本上,用户可以作为(或可能同时作为)供应商和活动教员的成员参与一个或多个活动

默认情况下,用户既不是供应商,也不是教员,而是在事件上下文中达到(或同时达到)一个(或两个)状态(例如,用户已作为其教员的成员被允许参加事件)

似乎我想说的是,用户通过供应商或教员链接表(或两者)拥有许多事件,但我不确定是否会在Rails模型中表示这些事件。以下是我迄今为止所尝试的:

class User < ActiveRecord::Base
  has_many :events through => vendors
  has_many :events through => faculty
end
有人能提供一些关于如何正确形成这个ActiveRecord关联的指导吗

更新:

因此,我尝试使用单表继承来解决这个问题,最终得到了一个用户表,其中只记录了一个用户类型。在仍然使用单表继承的情况下,如何让用户拥有多个类型?(我知道这本质上是一种多对多的关系;我只是不知道如何使用STI实现这一点。)


假设每个活动都有一张个人独有的门票,一个活动,并说明该人是否被录取为教员或供应商

class User < ActiveRecord::Base
  has_many :tickets
  has_many :events, through: :tickets
end

class Event < ActiveRecord::Base
  has_many :tickets
  has_many :users, through: :tickets
end

class Ticket < ActiveRecord::Base
  belongs_to :event
  belongs_to :user
  belongs_to :vendor
  belongs_to :faculty
end

class Faculty < ActiveRecord::Base
  has_many :tickets
end

class Vendor < ActiveRecord::Base
  has_many :tickets
end
class用户
您可能需要单表继承。简而言之:它允许将具有相同数据类型的多个类放入一个表中。唯一的要求是该表有一个
类型
列,一个
字符串

基本上,这是常识。比方说,用户可以拥有活动通行证:供应商通行证和教员通行证。他可能两者都有。让我们创建一个
Pass
模型,记住我们需要不同类型的模型。但我们以后会用的。现在,让我们继续看《代码》中的许多内容:

rails g model Pass type:string user:references event:references
迁移它,我们就不需要再修改数据库了。我们只修改Ruby。我们应该有一个类
通行证
,我们需要标记它在关联中的角色:

class Pass < ActiveRecord::Base
  belongs_to :user
  belongs_to :event
end
这就是STI魔法的来源。让我们再创建两个类

rails g model VendorPass --no-migration --parent=Pass
rails g model FacultyPass --no-migration --parent=Pass
我们已经生成了一些没有数据库表的类(我们不需要它们)。它们是空的,我们不会更改它:它们继承了一个
过程
,这就是我们所需要的。但是我们需要在
用户
事件
和新的过程之间创建一些额外的关联。最后,我发现这是可行的:

class Event < ActiveRecord::Base
  # We already had this
  has_many :passes
  has_many :users, through: :passes

  # New stuff!
  has_many :vendor_passes
  has_many :vendors, through: :vendor_passes, source: :user

  has_many :faculty_passes
  has_many :faculty_members, through: :faculty_passes, source: :user
end

class User < ActiveRecord::Base
  # We already had this
  has_many :passes
  has_many :events, through: :passes

  # New stuff!
  has_many :vendor_passes
  has_many :vendor_events, through: :vendor_passes, source: :event

  has_many :faculty_passes
  has_many :faculty_events, through: :faculty_passes, source: :event
end
class事件
Rails对
VendorPass
有自己的理解,即“它是
通行证
,其
类型
VendorPass
”,与
FacultyPass
相同

好的部分:

  • 很容易想象:数据结构似乎是合理的
  • 我们可以自由添加更多类型的
    Pass
    es,而无需更改数据库
坏的部分:

  • 无法仅向
    Pass
    的特定子类添加额外字段:它们都在同一个表中
  • 关联看起来有点重复和麻烦
  • Rails只允许
    类型
    成为
    字符串
    ,而不是最快的比较类型

请提供您需要对该数据进行的查询。当然,指定的是不正确的,因为您列出了两个名称相同但参数不同的关联。原始帖子已更新。我认为,您可以坚持使用
has\u many…,通过…
并使用单表继承来建立链接类型:common(不直接使用)、member和vendor(从common继承)。准备好后我会告诉你更多。请随意看看STI是如何工作的。我想我已经解决了单表继承的问题。我现在有了一个用户模型,教员模型和供应商模型从中继承。当我查看Users表中的记录时,我现在看到一个名为“type”的字段,其中包含用户的类型——Faculty或Vendor。问题是,如前所述,一个给定的用户可以(也可能会)被分类为多个用户类型。例如,用户既可以是教员,也可以是供应商。决定这一点的是用户参与的事件。如何允许将用户分类为多个用户类型?我将在回答中详细解释,但您需要继承一个连接模型,而不是
user
Event
,而是将它们链接在一起的东西。我有一些工作代码,STI的答案即将到来。感谢您抽出时间提供如此深入的回复。我想我明白你在这里干什么了。我要考虑一下这个问题。这很符合我的要求。你太棒了,伙计。认真地
class Event < ActiveRecord::Base
  has_many :passes
  has_many :users, through: :passes
end

class User < ActiveRecord::Base
  has_many :passes
  has_many :events, through: :passes
end
rails g model VendorPass --no-migration --parent=Pass
rails g model FacultyPass --no-migration --parent=Pass
class Event < ActiveRecord::Base
  # We already had this
  has_many :passes
  has_many :users, through: :passes

  # New stuff!
  has_many :vendor_passes
  has_many :vendors, through: :vendor_passes, source: :user

  has_many :faculty_passes
  has_many :faculty_members, through: :faculty_passes, source: :user
end

class User < ActiveRecord::Base
  # We already had this
  has_many :passes
  has_many :events, through: :passes

  # New stuff!
  has_many :vendor_passes
  has_many :vendor_events, through: :vendor_passes, source: :event

  has_many :faculty_passes
  has_many :faculty_events, through: :faculty_passes, source: :event
end