【问题标题】:Proper way to create instances of models with has_many :through relationship使用 has_many 创建模型实例的正确方法:通过关系
【发布时间】:2016-02-18 20:50:46
【问题描述】:

我有以下两个课程,我正在努力寻找有关如何正确创建活动和注册用户的信息。任何帮助将不胜感激 - 我的代码如下

class UserEvents < ActiveRecord::Base
    belongs_to :user
    belongs_to :event
end

class User < ActiveRecord::Base
  has_many :user_events
  has_many :events, :through => :user_events
end

class Event < ActiveRecord::Base
  has_many :user_events
  has_many :attendees, :class_name => "User", :through :user_events
end

用于创建事件的控制器操作

def create
    new_event = event.new(event_params)
    current_user.events << new_event
    new_event.attendees << current_user
    if new_event.save and current_user.save
        render json: new_event, status: :ok
    else
        render json: { errors: "Creation failed" }, status: :unprocessable_entity
end

我这样做对吗?我应该使用一组 ID 来跟踪与会者吗?我还看到它以类似于以下方式完成:

current_user.events.create ( ... )

我只是不确定哪种方法最好

【问题讨论】:

  • 什么是 user_outings?
  • @JimmyBaker 对不起,错字

标签: ruby-on-rails ruby activerecord rails-activerecord model-associations


【解决方案1】:

您可以将您的事件设置为接受嵌套属性,然后通过一次保存创建所有必要的对象。这是一个例子:

class Event < ActiveRecord::Base
  has_many :user_events
  has_many :attendees, :class_name => "User", through: :user_outings

  accepts_nested_attributes_for :user_events, allow_destroy: true
end

然后修改控制器中的 event_params 以接受 user_events 的属性。示例:

def event_params
  params.permit([
    :..event attributes...,
    user_events_attributes: [...user event attributes here...]
  ])
end

如果只是让当前用户参加一个新活动,那就太矫枉过正了。但是,如果您在创建事件时将其他用户添加到事件中,那么您就是这样做的。

如果它只是当前用户,那么您可以将创建操作修改为如下所示:

def create
    new_event = event.new(event_params)
    new_event.attendees << current_user

    if new_event.save and current_user.save
        render json: new_event, status: :ok
    else
        render json: { errors: "Creation failed" }, status: :unprocessable_entity
end

编辑:您也可以做acceptes_nested_attributes 并使用参加者,但您可能需要在模型中使用inverse_of 选项。详情请见https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through

【讨论】:

  • 谢谢,有帮助。我也看到过类似current_user.events.create(...)这样的方法,你熟悉这个方法吗?
  • 您也可以这样做。这真的取决于情况需要是什么。如果您只想让当前用户在创建时参加活动,那很好。但是,如果您想要的不仅仅是当前用户参加活动怎么办?如果您必须从应该参加的用户列表中进行选择怎么办?那么你最好发布带有参数的用户 ID 来创建事件。
  • 好的,太好了。最后一件事,我不确定向 UserEvents(桥)类添加属性是否会有所帮助的示例......我不会将人的 id 传递到 Events 类实例化的参数中吗?
  • 更重要的是,为什么要删除“current_user.events
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多