【问题标题】:Rails associations - User and EventsRails 关联 - 用户和事件
【发布时间】:2014-03-15 01:40:32
【问题描述】:

我一直在寻找一个好的答案,但似乎真的找不到,所以我不得不发布这个问题。

我正在使用 Rails 4.0.1 并且有点初学者,我正在尝试实现 2 个模型,一个用户和一个事件。

我希望注册我网站的用户能够加入许多活动,因此这些活动将有许多用户注册。

我必须同时使用 has_many 吗?我已经尝试过了,但是当我使用 rails 控制台向用户添加事件时,它仍然无法识别它们。我创建了 2 个迁移和 2 个模型。

我正在使用的模型如下

class User < ActiveRecord::Base
    has_many :events
end

class Event < ActiveRecord::Base
    has_many :events
end

迁移是:

class AddUserIdToEvents < ActiveRecord::Migration
  def change
    add_column :events, :user_id, :integer
    add_index :events, :user_id
  end
end

class AddEventIdToUsers < ActiveRecord::Migration
  def change
    add_column :users, :event_id, :integer
    add_index :users, :event_id
  end
end

我似乎无法弄清楚如何建立正确的关联,也无法弄清楚。我必须做些什么才能让用户注册许多活动并让活动让许多用户注册?谢谢大家

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 associations


    【解决方案1】:

    基本上,您需要在用户和事件之间设置多对多关系。 在这种情况下使用 has_and_belongs_to_many 关联。

    模型定义如下:

    class User < ActiveRecord::Base
      has_and_belongs_to_many :events
    end
    
    class Event < ActiveRecord::Base
      has_and_belongs_to_many :users      ## users and not events
    end
    

    在多对多关系中,会创建一个连接表,其中存储主表的主键(在您的情况下为用户和事件)。

    因此,请销毁您为添加外键创建的两个迁移。 如果您已经运行迁移,则执行

    rake db:rollback VERSION=versionnumber
    

    将版本号替换为迁移文件中前缀的版本号。 例如:如果您的迁移文件名是 20140314190622_create_projects.rb 那么命令应该是

    rake db:rollback VERSION=20140314190622
    

    对迁移 AddUserIdToEvents 和 AddEventIdToEvents 执行此操作。

    在此之后为连接表 users_events 生成迁移

    rails g migration CreateJoinTableUserEvent user event
    

    这将为 user_events(user_id, event_id) 创建一个迁移。

    使用rake db: migrate 运行迁移

    阅读 Rails 指南中的 Has and Belongs To Many Association。 另请参阅Rails Migrations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      相关资源
      最近更新 更多