Rails4如何在连接表上创建模型关系

时间:2013-11-16 05:09:25

标签: ruby-on-rails

这是用户表:

create_table :users do |t|
  t.string :name
  t.string :password
  t.string  :department

  t.timestamps
end

这是见面表:

create_table :meets do |t|
  t.string :name, null: false
  t.string :state, null: false
  t.string :description, null: false
  t.string :location, null: false
  t.float  :spend, null: false
  t.timestamps
end

以下是用户与见面之间的关系:

  1. 用户可以创建多个会议

  2. 会面可以有很多参与者(用户)

  3. 我是新手学习rails,我试图创建迁移和模型,但我不知道正确的方法:

    1. 用户可以创建多个符合,我想我可以在遇到迁移中添加引用以创建一对一的关系

      t.references :users
      
    2. 一次见面会有很多用户,我想我必须创建一个连接表:

      rails g migration CreateJoinTableUsersMeets user meet
      
    3. 上述命令将自动生成一个迁移文件:

      create_join_table :Users, :Ploys do |t|
        t.index [:user_id, :ploy_id]
        t.index [:ploy_id, :user_id]
      end
      

      但我想知道如何在连接表上创建模型关系?

1 个答案:

答案 0 :(得分:1)

我就是这样做的。

create_table :users do |t|
    t.string :name
    t.string :password
    t.string :department

    t.timestamps
end

create_table :meets do |t|
    t.string :name, null: false
    t.string :state, null: false
    t.string :description, null: false
    t.string :location, null: false
    t.float :spend, null: false
    t.references :creator, class_name: "User"

    t.timestamps
end

create_table :participations do |t|
    t.references :user
    t.references :meet
end

add_index :participations, [:user_id, :meet_id]
add_index :participations, [:meet_id, :user_id]



class User < ActiveRecord::Base
    has_many :meets, through: :participations
    has_many :created_meets, class_name: "Meet", foreign_key: "creator_id"
end

class Meet < ActiveRecord::Base
    has_many :users, through: :participations
    belongs_to :creator, class_name: "User"
end

您不在表中创建一对一关系,但您只需创建一个名为participations的连接表。该模型将引用用户和会议。然后,您可以通过将上述代码添加到两个模型来指定has_and_belongs_to_many。关键是它使用连接表来创建关联。如果您有任何其他问题,请评论:)