0

我目前有 3 张桌子。

片段标签片段标签

我正在使用HABTM。

所以我做了一个表格来保存带有标签的片段。关键字位于文本字段中,以逗号分隔。

我需要做的是从此文本字段中获取字符串,循环关键字,检查它们是否存在,如果不存在,则创建它们,然后保存片段。

我尝试了 before_save 但它似乎并没有那样做..

所以如果你能帮助我,那就太好了!

非常感谢!

4

4 回答 4

2

我认为 JosephL 的回答非常好。虽然,我会在 snippets_controller 操作中完成所有操作:

def create
  @snippet = Snippet.new(params[:snippet])

  @snippet.tags = params[:tags].split(',').collect { |tag| Tag.find_or_create_by_name(tag) }

  if @snippet.save
    # do something when successful
  else
    # do something when saving failed
  end
end

对不起,那冗长的单行声明。;-)

我没有测试代码,但我希望它有效。
Tag.find_or_create_by_name将这样做:当具有该名称的标签存在时,它将返回它,否则它将动态创建新标签并返回它。
这样,您调用@snippet.save.

请注意,我只是假设您的变量和参数是如何命名的。

于 2009-11-19T08:55:13.713 回答
2

这是您的create方法的一个版本。主要变化不是创建一个Snippet_Tag. 如果您的 HABTM 关联设置正确,那么您的代码段将有一个标签集合,您可以将标签添加到其中。该集合将作为Snippet_Tags by持久化ActiveRecord。有关 HABTM 关联的更多详细信息,请参阅rails 关联指南

def create
  # Creating the snippet
  @snippet = Snippet.new
  @snippet.title = params[:snippet][:title]
  @snippet.content = params[:snippet][:content]

  # loop through the tags
  params[:snippet][:tags].split(',').collect do |tag_string|
    tag_string.strip!
    if tag_string.length > 0
      # Find or create tag
      tag = Tag.find_or_create_by_name(tag_string)

      # Add tag to tags collection
      @snippet.tags << tag
    end
  end

  if @snippet.save
    # do something when successful
  else
    # do something when saving failed
  end
end
于 2009-11-19T20:46:08.463 回答
1
  1. 使用 split 将字符串分解为标签数组
  2. 按名称查找每个标签
  3. 如果找不到,则创建标签
  4. 将标签添加到代码段
  5. 保存片段(在您的控制器中)

放入片段模型的示例方法

def add_tags(tag_list_string)
   tag_array = tag_list_string.split ','
   tag_array.each do |tag_name|
     tag = (Tag.find_by_name(tag_name) || Tag.create(:name => tag_name))
     self.tags << tag
   end
end
于 2009-11-19T02:42:53.883 回答
0

试试before_update

于 2009-11-19T02:42:34.320 回答