是否可以为特定的关联集合创建自定义to_s方法?

时间:2009-07-08 18:45:07

标签: ruby-on-rails activerecord associations

我有一个Entry模型has_many :tags。我希望能够在文本输入中列出我的标签(即“tag-1,tag-2”等),但是,我遇到了一个问题。

如果我只是使用

form_for(:entry, form_options) do |f|
  f.text_field :tags
end

我的文本框已创建,但填充了类似#<Tag:0xb79fb584>#<Tag:0xb79faddc>的内容,这显然不是我想要的内容。

我知道我可以在Tag中添加to_s方法:

class Tag < ActiveRecord::Base
  def to_s
    name # the name of the tag
  end
end

但是这只会让我感到像tag-1tag-2这样的内容,因为@entry.tags.to_s仍然只是引用Array#to_s

现在,我正在使用

f.text_field :tags, :value => @entry.tags.map(&:name).join(", ")

相反,它将显示正确的字符串,但不会感觉像做事的“轨道方式”。有没有办法可以专门为我的to_s关联添加自定义tags方法?

2 个答案:

答案 0 :(得分:3)

有点hacky和可怕,但你可以

alias_method_chain :tags, :fancy_to_s
def tags_with_fancy_to_s
  assoc = tags_without_fancy_to_s
  def assoc.to_s; map(&:name).join(", "); end
  assoc
end

应该工作。

或者,您可以创建方法“tags_string”并让它在不滥用对象系统/维护编码器的大脑的情况下执行相同的操作。

答案 1 :(得分:1)

有一种更好的方法:虚拟属性。 This example显示了如何使用虚拟属性处理标记关联。