gpt4 book ai didi

ruby-on-rails - 我的 "has_many through"连接模型在保存后没有引用

转载 作者:行者123 更新时间:2023-12-02 02:26:11 25 4
gpt4 key购买 nike

我正在尝试创建一个对象并将现有对象添加到“has_many through”关联,但是在保存我的对象之后,对我新创建的对象的引用在连接模型中设置为 nil。

具体来说,我正在创建一个 Notification 对象并将一个预先存在的 Member 对象添加到 Notification.members 关联中。我正在使用嵌套资源并使用以下相对 URL 调用通知 Controller 的新功能:/成员/1/通知/新

填写表格并提交后,创建函数被调用,据我了解Rails Associations guide , section 4.3.3 “When are Objects Saved?”,当新的通知对象被保存时,应该在数据库中创建成员协会:

"If the parent object (the one declaring the has_many association) is unsaved (that is, new_record? returns true) then the child objects are not saved when they are added. All unsaved members of the association will automatically be saved when the parent is saved."

创建通知对象后,在数据库中创建了以下记录:

select id, notification_id, notifiable_type, notifiable_id from deliveries; 
1|<NULL>|Member|1

我通过在将成员对象添加到关联之前保存通知对象来解决这个问题。起初这似乎是一个不错的解决方案,但我很快发现这有它的缺点。我不想在没有成员关联的情况下保存通知,因为我必须为我的回调编写解决方法,以便它们不会开始对尚未有效的通知对象执行任务。

我在这里做错了什么?感谢所有提示。 :D

模型

class Notification < ActiveRecord::Base
has_many :deliveries, :as => :notifiable
has_many :members, :through => :deliveries, :source => :notifiable, :source_type => "Member"
has_many :groups, :through => :deliveries, :source => :notifiable, :source_type => "Group"
end

class Member < ActiveRecord::Base
has_many :deliveries, :as => :notifiable
has_many :notifications, :through => :deliveries
end

class Delivery < ActiveRecord::Base
belongs_to :notification
belongs_to :notifiable, :polymorphic => true
end

# Group is not really relevant in this example.
class Group < ActiveRecord::Base
has_many :deliveries, :as => :notifiable
has_many :notifications, :through => :deliveries
end

Controller

class NotificationsController < ApplicationController
def create
@notification = Notification.new(params[:notification])
@member = Member.find(params[:member_id])
@notification.members << @member

respond_to do |format|
if @notification.save
...
end
end
end
end

最佳答案

在发布 bug report 之后,我从一位 Rails 大师那里得到了一些帮助。简而言之,不可能按照我想的那样工作。

我决定继续使用稍微多一点的 Controller 代码,看起来工作得很好:

def create
@notification = Notification.new(params[:notification])
@member = Member.find(params[:member_id])

respond_to do |format|
if @notification.save
@member.notifications << @notification
@member.save
...

关于ruby-on-rails - 我的 "has_many through"连接模型在保存后没有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5888742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com