【问题标题】:has_many :through not creating my third modelhas_many :通过不创建我的第三个模型
【发布时间】:2015-08-27 20:02:27
【问题描述】:

我正在构建一个基于位置的应用程序,并注意到一些奇怪的行为。我的模型如下:

class User < ActiveRecord::Base
has_many :attendances, dependent: :destroy
has_many :events, through: :attendances

class Event < ActiveRecord::Base
acts_as_mappable :lat_column_name => :latitude,
                 :lng_column_name => :longitude

has_many :attendances, dependent: :destroy
has_many :users, through: :attendances

class Attendance < ActiveRecord::Base
belongs_to :user
belongs_to :event

所以问题是,在创建新事件时,我首先有user.events.new(params),然后我有一个 if 语句来检查新事件是否正确保存,所以if event.save #do stuff. 当我这样做时,Attendance未创建将user 连接到新创建的event 的模型,而如果我有user.events.create(params),,则成功创建了新的Attendance。这是正常的吗?在这种情况下我必须使用user.events.create 吗?为什么在我创建user.events.new 然后event.save 时没有创建一个新的Attendance

编辑:从events_controller.rb 添加Create 方法:

def create
if params[:username] && params[:password]
  username = params[:username]
  password = params[:password]
  user = User.find_by(username: username)
  if user
    if user.authenticate(password)
      event_title = params[:title]
      event_date = Date.parse(params[:date])
      event_description = params[:description]
      latitude = params[:latitude]
      longitude = params[:longitude]
      event = user.events.new(title: event_title, date: event_date, description: event_description, latitude: latitude,
        longitude: longitude)
      if event.save
        render :json => {id: event.id, title: event.title, date: event.date, description: event.description, latitude: event.latitude,
          longitude: event.longitude
        }
      else
        error_message(event.errors.full_messages)
      end
      #attendance = Attendance.find_by(user_id: user.id, event_id: event.id)
      #attendance.update_attribute(:host, 1)
    else
      error_message("Authentication failed. Please login, or sign up.")
    end
  else
    error_message("Username not recognized. Make sure username is right, or sign up.")
  end
else
  not_found
end
end

【问题讨论】:

  • 你能告诉我们事件控制器吗?
  • 当然。我将在我的事件控制器中编辑并添加 create 方法。

标签: ruby-on-rails associations has-many-through model-associations


【解决方案1】:

这种行为是意料之中的,这是一个众所周知的问题。幸运的是,它有一个解决方案。尝试将 inverse_of 参数添加到您的 belongs_to 关联中:

class Attendance < ActiveRecord::Base
  belongs_to :user, inverse_of: :attendances
  belongs_to :event, inverse_of: :attendances
end

您可以在此处阅读有关此问题的更多信息:Link

解决方案 2:

您也可以将控制器代码更改为:

  event = Event.new(...event_params...)
  if event.save
    user.events << event
    render :json => {...}
  else
    ...

【讨论】:

  • 假设我使用inverse_of,那是不是意味着每次创建新用户时都会自动创建一个新的event
  • 否,此选项用于其他目的。你可以在这里阅读更多关于它的信息guides.rubyonrails.org/association_basics.html
  • 你是对的。我意识到即使我没有按 Enter 键,Safari 也会发送 GET 请求,这会导致创建事件。不过感谢您的回答,这正是我所需要的,它解释了一堆我不知道的关于协会的事情!干杯!
【解决方案2】:

通常我会在模型中使用accepts_nested_attributes_for。然后使用.build方法将它们保存在create action中。

以下链接可能对您有所帮助: Association MethodsRails Casts: Nested Forms (这是关于 accept_nested_attributes_for 方法的一个很好的解释。)

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多