我正在寻找让表单编辑多个虚拟属性的“正确”导轨方式,这些虚拟属性保存在单个文本字段中。
现在,我们将 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