【问题标题】:Connecting a user model and event model in rails with foreign key?使用外键连接 Rails 中的用户模型和事件模型?
【发布时间】:2013-01-28 04:56:48
【问题描述】:

--更新:我一直在做更多的阅读,看起来我应该添加一个外键 - 有人可以告诉我如何去做吗?我应该删除我创建的那些额外字段吗?

--

我是 Ruby on Rails 的新手,在一些基本概念方面遇到了麻烦。我刚读完 Michael Hartl 的书,我正在使用 RailsApps bootstrap-devise-cancan 模板开始我的第一个应用程序。

我有一个用户模型和一个事件模型。我希望用户能够发布许多活动并参加许多活动。我将字段 events_attending 和 created_events 添加到 User 表中,Event 表包括 users_attending 和 user_created。我试图做到这一点,以便在提交“创建事件”表单时,user_created 字段填充有发布事件的任何用户,并且该事件 ID 记录在 created_events 下的用户表中。

我已添加到事件模型中:

  belongs_to :user
  has_many :users

以及用户模型(虽然我不确定这是否正确,因为用户可以属于多个事件。我查看了 has_and_belongs_to_many 并认为这可能是要走的路......):

  has_many :events
  belongs_to :event 

我不知道在控制器中放入什么来达到预期的效果。这是事件控制器中当前的内容:

  def create
    @event = Event.new(params[:event])

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
        format.json { render json: @event, status: :created, location: @event }
      else
        format.html { render action: "new" }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end

我应该向控制器添加什么,我还缺少什么?让我知道是否需要查看更多代码。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model controller foreign-keys


    【解决方案1】:

    Rails guidesother places 中提供了此问题的答案。很明显,你还没有掌握模型关系的基础知识,你应该多读一点。我会尽力帮助你:

    用户 has_many 事件是用户创建的事件的关系。该关系在数据库中建模为 Event 表上的 user_id 列。因此,当用户创建事件时,用户 id 将作为 user_id 保存在事件记录中。然后,Rails 为您提供帮助方法,例如 user.events,以获取用户创建的所有事件。

    另一个关系,用户参加活动,需要一个单独的表。您可以通过检查关系来了解原因。上面的用户和事件之间的关系是一对多的关系,一个用户可以创建许多事件,但每个事件只属于一个用户。这里的关系是多对多关系,一个事件可以被多个用户访问,每个用户可以访问多个事件。无法在关系数据库中以规范化的方式存储该信息。无论您查看关系的哪一边,用户或事件,数据都是一个数组...

    对此的解决方案是连接表,在该表中您有一对 user_ids 和 event_ids。 Rails 也可以处理这种关系,它被称为has_and_belongs_to_many 关系或简称 habtm。谷歌搜索将为您提供有关如何设置和使用它的信息。

    我要补充一点:如果您只想从一个角度查看关系,例如您将调用 user.event_visits 但从不调用 event.visiting_users,您可以在 user 中添加一列模型并跳过连接表。您需要的是 event_ids 的serialized column,然后您可以使用它来获取用户将访问的所有事件。以这种方式处理数据并未标准化(因此 DBA 不赞成),但根据您的需要可能是合理的。但这需要你做更多的工作。

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 2011-11-10
      • 2020-11-29
      • 2016-01-01
      • 2018-06-02
      • 1970-01-01
      • 2014-02-14
      • 2015-01-16
      • 2015-03-23
      相关资源
      最近更新 更多