【问题标题】:String to Serialized Array?字符串到序列化数组?
【发布时间】:2011-01-17 08:47:38
【问题描述】:

我敢肯定这是微不足道的,但过去几个小时我一直在用头撞桌子。我正在尝试在将字符串(即“key1,key2 :”)存储到数据库之前将其转换为数组(即 [“key1”,“key2”])。我在我的模型中使用了 before_validation 回调似乎没有开火。

我的模型如下所示:

class Product < ActiveRecord::Base
  serialize :keywords, Array
  attr_accessible :keywords

  before_validation :update_keywords

  def update_keywords
    self.update_attributes(:keywords, self.keywords.split(',').collect(&:strip)
  end
end

我收到了 SerializationTypeMismatch 错误。显然,update_keywords 方法要么没有运行,要么没有正确返回更新后的属性。

有什么想法吗?

编辑
我使用的是 Rails 3.0.3,如果这有什么不同的话。

编辑 #2
只是想跟进并说我发现删除序列化列类型声明并确保它默认为空数组(即 [])而不是 nil 可以解决许多问题。

为了像我这样刚刚开始使用 Rails 的人,我应该指出,这很可能不是创建序列化属性的最佳方式。我只是在移植一个使用旧数据库的项目。

【问题讨论】:

    标签: ruby-on-rails arrays string activerecord model


    【解决方案1】:

    如下更改update_keywords 的实现:

    def update_keywords
      if keywords_changed? and keywords.is_a?(String)
        self.keywords = keywords.split(',').collect(&:strip) 
      end
    end
    

    update_attributes 更新 DB 属性而不是对象属性。为了给对象属性赋值 使用赋值运算符。

    product.name = "Camping Gear"
    product.keywords = "camping, sports"
    
    product.save
    #  ---- 
    #  - "update_attributes" updates the table
    #  - "save" persists current state of the object(with `keywords` set to string.)
    #  - "save" fails as `keywords` is not an array
    #  ---
    

    在解决方案中,changed? 检查确保数组转换代码仅在关键字值更改时运行。

    【讨论】:

    • 谢谢!这行得通。你介意解释一下为什么要添加keywords_changed吗?最后检查有什么不同?
    • 更新了我的答案,看看吧。
    • 我已经多次提到这个答案。谢谢!
    【解决方案2】:

    这样试试

    def update_keywords
      self.keywords = self.keywords.split(",").map(&:strip) if self.keywords.is_a?(String)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多