Ruby on rails 定义一个'<<';ActiveRecord对象上属性的方法

Ruby on rails 定义一个'<<';ActiveRecord对象上属性的方法,ruby-on-rails,ruby,activerecord,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 class Thing

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

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
class Thing
我想补充一下

def objects<<(input)
  unless self.object_list == nil
    self.object_list << ",#{input}"
  else
    self.object_list = "#{input}"
  end
end

def objects我不知道您的我能够通过使用define_方法解决问题,如下所述

define_method("objects<<"){|input|
  unless self.object_list == nil
    self.object_list << ",#{input}"
  else
    self.object_list = "#{input}"
  end
}

define_方法(“objects我会这样做:

class Thing < ActiveRecord::Base
  def objects
    @objects ||= read_attribute(:objects).split(',')
  end

  def objects=(input)
    @objects=input
    write_attribute(:objects, @objects.join(','))
  end
end
class Thing
这应该允许您像对待数组一样对待对象,但要将其另存为数据库中以逗号分隔的列表


请参见Rails API中的内容。

也要避免将
else
一起使用,除非它会使大多数人难以阅读!如果self.object\u list
在这里我尝试过,它会在上发疯。您可能想补充一点,这就像是一个真正的值位掩码,意图是表单将使用多个复选框名为“objects[]的字段",每个值一个。如果你这样做,你将无法像他在示例中那样留下一个空间。也就是说,这不起作用:
objects这是一个比我建议的更优雅的解决方案,谢谢!没问题,很高兴你喜欢它。哦,@biagidp,仔细考虑后,如果你有
objects
objects=
方法,那就没有了根本不需要调用
attr_accessor
,您只是在覆盖它。我编辑了答案以反映这一点。只要属性不是这样:“1999”、“雪佛兰”、“Venture”“Extended Edition,甚大”、“5000.0000”(包含分隔符),就可以了从^^^开始,如有必要,您必须处理转义等操作,并且您需要确保没有超出数据类型的限制,例如,如果这是字符串字段,则字符串的长度。
class Thing < ActiveRecord::Base
  def objects
    @objects ||= read_attribute(:objects).split(',')
  end

  def objects=(input)
    @objects=input
    write_attribute(:objects, @objects.join(','))
  end
end