-1

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

--

我是 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

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

4

1 回答 1

0

这个问题的答案可以在Rails 指南其他地方找到。很明显,你还没有掌握模型关系的基础知识,你应该多读一点。我会尽力帮助你:

Users 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 一样,您可以摆脱用户模型中的一列并跳过连接表。您需要的是 event_ids 的序列化列,然后您可以使用它来获取用户将访问的所有事件。以这种方式处理数据并没有标准化(因此 DBA 不赞成),但根据您的需要可能是合理的。这将需要你做更多的工作。

于 2013-01-28T08:58:35.197 回答