我正在构建一个允许用户发布活动的活动应用,其他用户可以“注册”自己参加该活动。我目前有两个模型,“用户”和“文章”,其中文章是用户可以发布的事件。文章belongs_to :user
和用户has_many :articles, dependent: :destroy
。
我正在尝试建立一个新的数据库来存储哪些用户计划参加活动,以“注册”的形式存储用户和他计划参加的活动。这意味着我需要用户和文章之间的多对多关联(因为用户可以参加多个活动,并且活动可以有多个与会者)。但这不会与声明文章属于单个用户的原始设置冲突吗?
我如何设置它以便我的协会不会干涉?
答案 0 :(得分:3)
您可以尝试has_many through:
或has_and_belongs_to_many
关系。就我个人而言,我认为我会使用HABTM,但HM Through的优点是有一个中间模型,可以用于其他信息(例如"参与者"是否正在进行或只是感兴趣,等等):http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association
至于在相同的两个模型之间存在多个不同的关联,您可以将关联命名为您喜欢的任何名称,但指定您指向的模型的class_name:http://guides.rubyonrails.org/association_basics.html#has-and-belongs-to-many-association-reference
例如:
class Article < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :attendees, class_name: "User", join_table: "articles_attendees", foreign_key: "attended_event_id", association_foreign_key: "attendee_id"
...
end
对于您的用户模型:
class User < ActiveRecord::Base
has_many :articles
has_and_belongs_to_many :attended_events, class_name: "Article", join_table: "articles_attendees", foreign_key: "attendee_id", association_foreign_key: "attended_event_id"
...
end
通过这种方式,您可以随心所欲地命名您的关联,只需确保您的单数和单数复数,并且通常一切都是可读的。 class_name
应该是您定义关系的模型的名称。 foreign_key
是数据库列名,包含定义关系的模型的ID。例如,在您的用户模型中,foreign_key
应为用户ID。 association_foreign_key
是包含要链接的模型的ID的列。
也不要忘记创建迁移。像这样的例子:
class CreateArticlesAttendees < ActiveRecord::Migration
def self.up
create_table :articles_attendees, :id => false do |t|
t.references :attended_event
t.references :attendee
end
add_index :articles_attendees, [:attended_event_id, :attendee_id]
add_index :articles_attendees, :attendee_id
end
def self.down
drop_table :articles_attendees
end
end