Ruby on rails Rails 3.2.1关联没有回调?

Ruby on rails Rails 3.2.1关联没有回调?,ruby-on-rails,ruby,associations,Ruby On Rails,Ruby,Associations,首先,我使用的是Rails 3.2.1和ruby 1.9.3p392 我有两种型号,ad_用户和设备 ad\u用户有许多设备,而设备属于ad\u用户 我的模型如下: class AdUser < ActiveRecord::Base has_many :devices class Device < ActiveRecord::Base belongs_to :device_type belongs_to :device_status

首先,我使用的是Rails 3.2.1和ruby 1.9.3p392

我有两种型号,ad_用户和设备

ad\u用户
有许多
设备
,而
设备
属于
ad\u用户

我的模型如下:

class AdUser < ActiveRecord::Base
    has_many    :devices

class Device < ActiveRecord::Base
    belongs_to      :device_type
    belongs_to      :device_status
    belongs_to      :ad_user
    validates_presence_of       :name
    validates_uniqueness_of     :name
    validates_presence_of       :serial
    validates_uniqueness_of     :serial
    validates_presence_of       :device_type_id
    validates_presence_of       :device_status_id
    validates_presence_of       :ad_user_id

    before_update           :before_update_call
    before_save             :before_save_call
    before_create           :before_create_call
    before_validation       :before_validation_call

    protected

    def before_update_call
            p self.name
            p self.ad_user_id
            p "-=-=-=-=-=-=-=-=-"
            p "before_update_call"
            self.ad_user_id = 1 if self.ad_user_id.nil? || self.ad_user_id.blank?
    end
    def before_save_call
            p self.name
            p self.ad_user_id
            p "-=-=-=-=-=-=-=-=-"
            p "before_save_call"
            self.ad_user_id = 1 if self.ad_user_id.nil? || self.ad_user_id.blank?
    end
    def before_create_call
            p self.name
            p self.ad_user_id
            p "-=-=-=-=-=-=-=-=-"
            p "before_create_call"
            self.ad_user_id = 1 if self.ad_user_id.nil? || self.ad_user_id.blank?
    end
    def before_validation_call
            p self.name
            p self.ad_user_id
            p "-=-=-=-=-=-=-=-=-"
            p "before_validation_call"
            self.ad_user_id = 1 if self.ad_user_id.nil? || self.ad_user_id.blank?
    end
我可以看到
在验证调用之前
在保存调用之前
在更新调用之前
打印到控制台,但是当我使用以下命令从用户取消分配这些设备时:

u.device_ids=[]
它产生了一个简单的结果:

SQL (2.0ms) UPDATE "devices" SET "ad_user_id" = NULL WHERE "devices"."ad_user_id" = 405 AND "devices"."id" IN (332, 333)
没有调用任何回调,并且我的设备最终拥有一个nil
ad\u user\u id
,尽管模型应该验证存在性。我计划在保存或更新之前使用回调来检查
ad\u user\u id
是否为nil,但它们甚至没有被调用


我在这里做错了什么吗?

不幸的是,我认为这是意料之中的行为。您不应该依赖于在更新关联时触发的回调,所以底层模型是隐式更新的

不过,您可以尝试访问
设备
字段<代码>设备ID在较低级别上执行不同的操作

也可以考虑使用,如果合适的话,


注意:在Rails中,您可以使用
self.ad\u user.present?
而不是
self.ad\u user\u id.nil?|self.ad\u user\u id.blank?
。此外,您还可以合并
验证
语句的存在。

好吧,在
ad\u用户
控制器的
更新
方法中,在
更新属性之前添加:

old_device_ids = @ad_user.device_ids
(old_device_ids - AdUser.find(params[:id]).device_ids).each do |device|
    Device.find(device).update_attributes(:ad_user_id => 1)
end
更新\u属性之后,我添加了:

old_device_ids = @ad_user.device_ids
(old_device_ids - AdUser.find(params[:id]).device_ids).each do |device|
    Device.find(device).update_attributes(:ad_user_id => 1)
end

我之前已经这么做了,但我想找到一种合适的“Rails方式”来做。

我不会在控制器中做这件事。幸运的是,我没有看到任何其他方式来实现这一点。离题:请升级到Rails 3.2.1的3.2.17版本,因为它存在严重的安全漏洞。在
Gemfile
中更新rails版本,然后运行
bundle Update rails
。有关更多信息,请参阅