我确信这是微不足道的,但过去几个小时我一直在敲桌子。我正在尝试将字符串(即“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的旅程,我应该注意,这很可能不是创建序列化属性的最佳方式。我只是移植了一个利用旧数据库的项目。
答案 0 :(得分:6)
更改update_keywords
的实施,如下所示:
def update_keywords
if keywords_changed? and keywords.is_a?(String)
self.keywords = keywords.split(',').collect(&:strip)
end
end
update_attributes
更新数据库属性而不是对象属性。为了给对象属性赋值
使用赋值运算符。
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?
检查确保仅在关键字值更改时才运行数组转换代码。
答案 1 :(得分:0)
试试这个
def update_keywords
self.keywords = self.keywords.split(",").map(&:strip) if self.keywords.is_a?(String)
end