我有一个DI例程,我有一个很大的csv我用已知的列格式导入。我首先设置了一个列映射:
col_map =
{
4 => :name,
6 => :description,
21 => :in_stock,
...
然后我读取每一行,然后使用列映射,尝试设置属性:
i = Item.new
col_map.each do |k,v|
i[v] = chunks[k] #chunks is the line read in split by the delimiter
在我的项目声明中,我声明了两个属性,b / c这些属性没有存储在数据库中,它们被用于其他逻辑:
attr_writer :in_stock
attr_writer :end_date
代码到达此行时:
i[v] = chunks[k]
我收到此消息:
X.DEPRECATION WARNING: You're trying to create an attribute `in_stock'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer`
但我没有尝试创建属性,而我正在使用attr_writer。我怀疑这与[]我使用而不是。对于左值。
任何人都可以看到我做错了吗?
感谢您的帮助, 凯文
答案 0 :(得分:1)
不可否认,弃用措辞略有混淆,但您会看到此警告,因为model[attribute_name] = ...
样式仅支持模型上的ActiveRecord属性,而不支持{{1}添加的非持久属性}。
您可以看到产生警告over here的代码。
为了解决这个问题,我使用了attr_writer
,它适用于所有属性,例如。
send