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



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

--

我是Ruby on Rails的新手,在一些基本概念上遇到了麻烦。我刚刚读完了Michael Hartl的书,我正在使用RailsApps引导程序-设计-cancan模板来启动我的第一个应用程序。

我有一个用户模型和一个事件模型。我希望用户能够发布许多活动并参加许多活动。我将字段 events_attending 和 created_events 添加到用户表中,事件表包括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

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

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

用户has_many事件是用户创建的事件的关系。该关系在数据库中建模为事件表上的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 不赞成),但根据您的需要可以合理。这将需要你做更多的工作。

相关内容

  • 没有找到相关文章