新手问题 [已经解决,thx] ActiveRecord::Base after_find 的问题 !

u1351384616 · 2015年08月29日 · 最后由 u1351384616 回复于 2015年10月05日 · 1597 次阅读

今天遇到一个奇怪的问题:

代码如下:

class Role < ActiveRecord::Base

  after_find do |record|
    unless record.rule.nil?
      # 转换为hash类型, rule原来是hash字符串
      record.rule = JSON.parse(record.rule)
    end
  end

end

class RolesController < ApplicationController
  def show
    @role = Role.find(1)
    # role.rule 居然是字符串类型
  end
end

rule 在数据库中定义的类型是string 我想在查询之后, 通过after_find 回调把rule的字符串转换为 hash, 但是问题出现了,在controller, 或者view中是使用@role.rule的时候, rule居然还是字符串类型的 ???? 各位,有没有遇到过类似的问题, 看看如何解决

共收到 5 条回复

楼主你的用法不对,这里 after_find 应该是执行了的,因为 record.rule 在数据库中是 text 类型,所以在 record.rule 重新赋值的时候还发生了一次隐性的类型转换,相当于

record.rule = JSON.parse(record.rule).to_s

如果你真的想存 JSON 格式,从数据库中取出来的时候转 Hash 的话,建议你 JSON 类型的 serialize

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html

這個地方應該使用 serialize

class Role < ActiveRecord::Base
   serialize :rule, JSON
end

@fumesy 太感谢了, 学习了,%>_<%

学习。。。

#2楼 @fumesy 这种方式感觉json数组不行?find出来之后还是字符串

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册