Ruby on rails 我需要帮助正确建立这个ActiveRecord协会
基本上,用户可以作为(或可能同时作为)供应商和活动教员的成员参与一个或多个活动 默认情况下,用户既不是供应商,也不是教员,而是在事件上下文中达到(或同时达到)一个(或两个)状态(例如,用户已作为其教员的成员被允许参加事件) 似乎我想说的是,用户通过供应商或教员链接表(或两者)拥有许多事件,但我不确定是否会在Rails模型中表示这些事件。以下是我迄今为止所尝试的: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 =>
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
相同
好的部分:
- 很容易想象:数据结构似乎是合理的
- 我们可以自由添加更多类型的
es,而无需更改数据库Pass
- 无法仅向
的特定子类添加额外字段:它们都在同一个表中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