0

我正在寻找让表单编辑多个虚拟属性的“正确”导轨方式,这些虚拟属性保存在单个文本字段中。

现在,我们将 8 个虚拟属性存储在单个文本字段中,并将它们存储为易于解析的字符串,例如:"weekday=monday; repeat_weekly_for= 5; repeat_monthly_for=4; ..."

然后(如下详述)表单对每个虚拟属性都有一个 text_field,模型对每个虚拟属性都有一个 getter 和 setter。

当我们需要一个属性值,或者需要设置一个属性值时,我们首先使用正则表达式将字符串解析成哈希。

有用。问题是每次用户显示然后更新表单时,同一个正则表达式解析器被调用 16 次(8 次“读取”8 个虚拟属性,8 次“写入”8 个虚拟属性中的每一个)。

有没有办法一次为所有 8 个虚拟属性实现 getter 和 setter?

规格:

目前,我们的表单如下所示:

= f.text_field :weekday  /first virtual attribute
= f.text_field :repeat_weekly_for  /second virtual attribute
= f.text_field :repeat_monthly_for  /third virtual attribute
...

所以我们为每个看起来相同的虚拟属性设置了 getter 和 setter:

def weekday
  self.schedule_to_hash['weekday'] # this gets done 8 times for 8 attributes
end
def weekday=(the_weekday)
  schedule_hash = self.schedule_to_hash  # this gets done 8 times for 8 attributes
  schedule_hash['weekday'] = the_weekday
  self.hash_to_schedule(schedule_hash) # this gets done 8 times for 8 attributes
end

每个 getter 和 setter 都使用这两种方法在哈希和字符串格式之间进行转换:

def schedule_to_hash()
  # takes string self.schedule, does regex to split into hash, returns the hash
end

def hash_to_schedule(some_hash)
  # put the hash into a string format compatible with the regex in schedule_to_hash()
end
4

1 回答 1

2

ActiveRecord 有一个称为序列化的方法http://apidock.com/rails/ActiveRecord/AttributeMethods/Serialization/ClassMethods/serialize

你可以像这样使用它:

class MyModel < ActiveRecord::Base
  serialize :schedule, Hash

  def weekday
    schedule ||= {}
    schedule['weekday']
  end

  def weekday=(the_weekday)
    schedule ||= {}
    schedule['weekday'] = the_weekday
  end
end

保存/加载对象时,Rails 将为您执行序列化/反序列化。

于 2013-01-07T21:34:14.147 回答