我有一个活动记录对象,它有自定义访问器,用于将数组存储为逗号分隔文本。
class Thing < ActiveRecord::Base
attr_accessible :object_list
def objects
self.object_list.split(",") rescue []
end
def objects=(input)
self.object_list = input.join(',')
end
end
我想添加以下内容
def objects<<(input)
unless self.object_list == nil
self.object_list << ",#{input}"
else
self.object_list = "#{input}"
end
end
这样我可以做像
这样的事情thing.objects << 'this'
这可能吗?
答案 0 :(得分:3)
我会这样做:
class Thing < ActiveRecord::Base
def objects
@objects ||= read_attribute(:objects).split(',')
end
def objects=(input)
@objects=input
write_attribute(:objects, @objects.join(','))
end
end
这应该允许您将对象视为数组,但将其保存为数据库中的逗号分隔列表。
请参阅Rails API中的Overwriting Default Accessors。
答案 1 :(得分:1)
我不知道你的&lt;&lt;方法,但为什么不用户序列化?
http://api.rubyonrails.org/classes/ActiveModel/Serialization.html
答案 2 :(得分:1)
我能够通过使用如下所述的define_method来解决问题
define_method("objects<<"){|input|
unless self.object_list == nil
self.object_list << ",#{input}"
else
self.object_list = "#{input}"
end
}