使用外键在rails中连接用户模型和事件模型?

时间:2013-01-28 04:56:49

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

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

-

我是Ruby on Rails的新手,我遇到了一些基本概念的问题。我刚刚完成了Michael Hartl的书,我正在使用RailsApps bootstrap-devise-cancan模板在我的第一个应用程序上启动。

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

我已添加到活动模型中:

  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

我应该向控制器添加什么,以及我还缺少什么?如果需要查看更多代码,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

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

用户has_many事件是用户创建的事件的关系。该关系在数据库中是modeld,作为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一样,你可以在用户中找到一个列模型并跳过连接表。您需要的是serialized column event_ids,然后您可以使用它来获取用户将访问的所有事件。以这种方式处理数据不是规范化的(因此DBA不赞成),但根据您的需要可能是合理的。这将需要你的工作更多的工作thoshi。