在Rails中,我们可以使用obj.field_changed?
来检查模型属性是否已更改。
假设我有一个使用Globalize3
的模型。
它有translates :name
如何检查名称属性是否已更改?
像obj.name_changed?
答案 0 :(得分:4)
我不确定建议的答案是否真的会给你预期的结果。
说你有
class Post < ActiveRecord::Base
translates :name
end
如果您实例化帖子:
p = Post.last
检查其名称:
p.name
=> "My old name"
并更改名称:
p.name = "My new name"
如果你这样做:
p.name_changed?
你会得到一个no方法错误。
如果您按照建议在模型中调用翻译类:
class Post < ActiveRecord::Base
translates :name
.......
# Open the Translation class
class Translation
after_save do #you may define a private method as callback method
if name_changed?
#accomplish your tasks...
end
end
end
end
在保存主要可翻译记录后,您将只能知道您的属性是否已更改。这可能不是你想要的(想象一下你想要生成一个新的slug,根据帖子每次更改时的新名称,你必须再次保存你的帖子。)
您可以尝试(在保存帖子之前)a:
,而不是在方法中调用类p.translation.name_changed?
=> false
结果将是错误的。这可以解释。如果在使用:
更改名称后p.name = "My new name"
=> "My new name"
p.translation.name将返回:
p.translation.name
=> "My old name"
这是因为Globalize将已翻译的属性存储在实例化的可翻译模型的虚拟属性中。
你可以这样做:
p.translation.name = "My new name"
=> "My new name"
然后:
p.translation.name_changed?
=> true
但是,您失去了使用Globalize的部分好处。
我所做的是,在Post模型中,我覆盖了我感兴趣的虚拟属性的getter和setter:
def name
translation.name
end
def name=(val)
translation.name = val
end
现在,如果我这样做:
p.name
=> "My old name"
p.name = "My new name"
=> "My new name"
p.name_changed?
# no method error
p.translation.name_changed?
=> true
p.translation.name
=> "My new name"
这样,在保存帖子之前。
答案 1 :(得分:1)
我得到了解决方案。考虑到有人可能会受益,我会将其作为答案发布。
要检查已翻译的属性是否已更改,只需在相应的模型类中打开Translation class
提供的Globalize3
。
class Post < ActiveRecord::Base
translates :name
.......
# Open the Translation class
class Translation
after_save do #you may define a private method as callback method
if name_changed?
#accomplish your tasks...
end
end
end
end