Rails ActiveRecord更新字段

时间:2010-02-21 10:01:10

标签: ruby-on-rails activerecord model

我的例子:

class Category < ActiveRecord::Base
  has_many :tags, :as => :tagable, :dependent => :destroy

  def tag_string
    str = ''
    tags.each_with_index do |t, i|
      str+= i > 0 ? ', ' : ''
      str+= t.tag
    end
    str
  end

  def tag_string=(str)
    tags.delete_all
    Tag.parse_string(str).each { |t| tags.build(:tag => t.strip) }
  end

end

您如何优化此tag_string字段?每次我想要更新它们时,我都不想删除所有标签。有没有更好的方法来解析字符串与标签? 我不想使用插件! THX。

3 个答案:

答案 0 :(得分:2)

我知道您不想使用插件,但您可能希望深入了解acts_as_taggable_on_steroids的来源,了解他们是如何处理这些情况的。根据我的经验,使用该插件非常轻松。

答案 1 :(得分:1)

class Category < ActiveRecord::Base
  has_many :tags, :as => :tagable, :dependent => :destroy

  def tag_string
    tags.map {|t| t.name }.join ', '
  end

  def tag_string=(str)
    tags = Tag.parse_string(str)
  end

end

我不知道Tag.parse_string(str)方法做了什么。如果它返回Tag个对象的数组,那么我的示例应该可以工作。而且我不确定这是否只会更新,或删除旧版本并添加新版本。您可以对其进行测试并查看日志中的实际内容。

答案 2 :(得分:1)

我同意其他评论者的意见。你最好在这里使用插件。这是一个解决方案。

 class Category < ActiveRecord::Base
  has_many :tags, :as => :tagable, :dependent => :destroy

  def tag_string
    tags.collect(&:name).join(", ")
  end

  def tag_string=(str)
    # Next line will delete the old association and create
    # new(based on the passed str). 
    # If the Category is new, then save it after the call.
    tags = Tag.create(str.split(",").collect{ |name| {:name => name.strip} })
  end

end