Ruby on rails Rails,3检查转换的属性是否更改?

Ruby on rails Rails,3检查转换的属性是否更改?,ruby-on-rails,globalize3,Ruby On Rails,Globalize3,在Rails中,我们可以使用obj.field\u changed?检查模型属性是否更改 假设我有一个使用Globalize3的模型 它有翻译:name 如何检查名称属性是否已更改 类似于obj.name\u改变了?我得到了解决方案。考虑到有人可能会从中受益,我将其作为一个答案发布 要检查已翻译的属性是否已更改,只需在相应的模型类中打开由Globalize3提供的Translation类 class Post < ActiveRecord::Base translates :name

在Rails中,我们可以使用
obj.field\u changed?
检查模型属性是否更改

假设我有一个使用
Globalize3
的模型

它有
翻译:name

如何检查名称属性是否已更改


类似于
obj.name\u改变了?
我得到了解决方案。考虑到有人可能会从中受益,我将其作为一个答案发布

要检查已翻译的属性是否已更改,只需在相应的模型类中打开由
Globalize3
提供的
Translation类

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
class Post
我不确定提议的答案是否真的能给你预期的结果

说你有

class Post < ActiveRecord::Base
  translates :name
end
检查其名称:

p.name
=> "My old name"
并更改名称:

p.name = "My new name"
如果您这样做:

p.name_changed?
您将得到一个无方法错误

如果按照您的建议,从模型中调用Translation类:

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
结果将是错误的。这是可以解释的。如果在使用以下命令更改名称后:

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"
然后:

但是,您失去了使用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"

在保存帖子之前,请更仔细地解释一下,它是在同一个请求下更改的还是可以在一个小时前更改的?当然是在同一个请求上,Globalize gem中有一个关于此的问题,但它已关闭:这有助于解释很多问题,感谢您的详细解释!
p.translation.name_changed?
=> true
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"