我正在构建基于位置的应用程序,并注意到一些奇怪的行为。我的模型如下:
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
的{{1}}模型,而如果我event
已成功创建新user.events.create(params),
。这是正常的吗?在这种情况下我是否必须使用Attendance
?为什么我在user.events.create
然后Attendance
时创建了新的user.events.new
?
编辑:从event.save
添加Create
方法:
events_controller.rb
答案 0 :(得分:2)
此行为是预期的,这是一个众所周知的问题。幸运的是,它有一个解决方案。尝试将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
...
答案 1 :(得分:0)
通常我会在模型中使用accepts_nested_attributes_for
。然后使用.build
方法将它们保存在创建操作中。
这里有一些链接可能对您有所帮助: Association Methods和Rails Casts: Nested Forms(这是对accepts_nested_attributes_for方法的一个很好的解释。)
希望有所帮助