定义'<<<< ActiveRecord对象上的属性的方法

时间:2012-11-06 20:16:42

标签: ruby-on-rails ruby activerecord

我有一个活动记录对象,它有自定义访问器,用于将数组存储为逗号分隔文本。

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'

这可能吗?

3 个答案:

答案 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
}