覆盖模型属性

时间:2012-09-04 09:12:48

标签: ruby-on-rails-3 attributes

这是事情。我有一个国家模型,有两列“语言”和“default_language”。因此,例如,对于瑞士,这些列分别设置为“de,fr,it”和“de”。

现在,如果我做Country.languages,我会得到“de,fr,it”字符串。我怎么能覆盖这个,所以当我得到Country.languages我得到一个数组[“de”,“fr”,“it”]?

当然我可以创建一个函数def available_languages,但我仍然不希望语言公开。

1 个答案:

答案 0 :(得分:5)

对于这种情况下的简单数组,最好编写自己的解决方案。

这可以通过覆盖getter / setter方法来完成:

在你的模特中:

class Country < ActiveRecord::Base
  def languages
    read_attribute(:languages).split(',')
  end
  def languages=(array)
    write_attribute(:languages,array.join(','))
  end
end

对于哈希,您可以使用ActiveRecord::Store,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Store.html

对于更一般的对象(不只是数组,您可以使用serialize),请参阅http://duanesbrain.blogspot.co.nz/2007/04/ruby-on-rails-persist-array-to-database.html