Ruby on rails Rails 3.2.1关联没有回调?
首先,我使用的是Rails 3.2.1和ruby 1.9.3p392 我有两种型号,ad_用户和设备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
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)
没有调用任何回调,并且我的设备最终拥有一个nilad\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
。有关更多信息,请参阅