两个模型Rails之间有不同的关联

时间:2016-04-17 06:51:27

标签: ruby-on-rails ruby database

我正在构建一个允许用户发布活动的活动应用,其他用户可以“注册”自己参加该活动。我目前有两个模型,“用户”和“文章”,其中文章是用户可以发布的事件。文章belongs_to :user和用户has_many :articles, dependent: :destroy

我正在尝试建立一个新的数据库来存储哪些用户计划参加活动,以“注册”的形式存储用户和他计划参加的活动。这意味着我需要用户和文章之间的多对多关联(因为用户可以参加多个活动,并且活动可以有多个与会者)。但这不会与声明文章属于单个用户的原始设置冲突吗?

我如何设置它以便我的协会不会干涉?

1 个答案:

答案 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