3

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

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'

那可能吗?

4

3 回答 3

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

这应该允许您将对象视为数组,但将其保存为 db 中的逗号分隔列表。

请参阅覆盖Rails API 中的默认访问器。

于 2012-11-06T20:57:34.660 回答
1

我不知道您的 << 方法,但为什么不知道用户序列化?

http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

于 2012-11-06T20:38:00.613 回答
1

我能够通过使用如下所述的 define_method 来解决这个问题

define_method("objects<<"){|input|
  unless self.object_list == nil
    self.object_list << ",#{input}"
  else
    self.object_list = "#{input}"
  end
}
于 2012-11-06T20:38:48.490 回答