【问题标题】:Can a custom to_s method be created for a specific association collection?可以为特定的关联集合创建自定义 to_s 方法吗?
【发布时间】:2009-07-08 18:45:06
【问题描述】:

我有一个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(", ")

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

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    有点骇人听闻,但你可以

    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”并让它做同样的事情,而不会滥用对象系统/维护编码人员的大脑。

    【讨论】:

    • 我是维护编码员(这是一个个人项目),所以我不担心;)。我考虑只添加一个tag_names 方法,但要权衡的是,我需要控制器中的额外代码来设置@entry.tags 以进行保存。
    • false,在模型(它所属的位置)上定义一个 tags_string= 并让它处理按名称标准标签内容查找或创建。更好的是,您可以使用acts_as_taggable_on_steroids 或类似的东西免费获得这一切。
    【解决方案2】:

    有一个更好的方法来做到这一点:虚拟属性。 This example 准确展示了如何使用虚拟属性处理标签关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多