我目前有3张桌子。
代码段 标签 snippet_tags
我正在使用HABTM。
所以我做了一个表单来保存带有标签的代码段。关键字位于文本字段中,以逗号分隔。
我需要做的是从这个文本字段中取出字符串,循环关键字,检查它们是否存在,如果不存在,然后保存片段。
我尝试过使用before_save,但似乎并没有这样做..
所以,如果你能帮助我,那太好了!
非常感谢!
答案 0 :(得分: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
。
请注意,我刚才假设你的变量和参数是如何命名的。
答案 1 :(得分:2)
以下是create
方法的一个版本。主要变化不是创建Snippet_Tag
。如果您的HABTM关联设置正确,那么您的代码段将包含一个标签集合,您可以将标签添加到该集合中。该集合将Snippet_Tag
保留为ActiveRecord
。有关HABTM关联的更多详细信息,请参阅rails associations guide。
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
答案 2 :(得分:1)
放入代码段模型的示例方法
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
答案 3 :(得分:0)
试试before_update
?