在Rails中,我们可以使用obj.field_changed?检查是否更改了模型属性。
假设我有一个使用Globalize3的模型。
它有translates :name
如何检查name属性是否已更改?
有点像obj.name_changed?
发布于 2015-10-15 07:13:22
我找到解决办法了。我张贴它作为一个答案,考虑到有人可能会受益。
要检查转换后的属性是否被更改,只需在相应的模型类中打开Globalize3提供的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发布于 2016-02-24 19:07:44
我不知道建议的答案是否真的能给你带来预期的结果。
说你有
class Post < ActiveRecord::Base
translates :name
end如果您实例化了一个帖子:
p = Post.last检查它的名称:
p.name
=> "My old name"并更改名称:
p.name = "My new name"如果你这样做了:
p.name_changed?您将得到一个无方法错误。
如果像您建议的那样,从模型中调用the类:
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只有在保存了主要可翻译记录之后,您才能知道属性是否发生了更改。这可能不是您想要的(例如,假设您想要生成一个新的段塞,根据它每次更改时的新名称,您将不得不第二次保存您的帖子)。
与在方法中调用类不同,您还可以尝试(在保存帖子之前) 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"还有这个,在保住这个职位之前。
https://stackoverflow.com/questions/33080240
复制相似问题