我目前有 3 张桌子。
片段标签片段标签
我正在使用HABTM。
所以我做了一个表格来保存带有标签的片段。关键字位于文本字段中,以逗号分隔。
我需要做的是从此文本字段中获取字符串,循环关键字,检查它们是否存在,如果不存在,则创建它们,然后保存片段。
我尝试了 before_save 但它似乎并没有那样做..
所以如果你能帮助我,那就太好了!
非常感谢!
我目前有 3 张桌子。
片段标签片段标签
我正在使用HABTM。
所以我做了一个表格来保存带有标签的片段。关键字位于文本字段中,以逗号分隔。
我需要做的是从此文本字段中获取字符串,循环关键字,检查它们是否存在,如果不存在,则创建它们,然后保存片段。
我尝试了 before_save 但它似乎并没有那样做..
所以如果你能帮助我,那就太好了!
非常感谢!
我认为 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
.
请注意,我只是假设您的变量和参数是如何命名的。
这是您的create
方法的一个版本。主要变化不是创建一个Snippet_Tag
. 如果您的 HABTM 关联设置正确,那么您的代码段将有一个标签集合,您可以将标签添加到其中。该集合将作为Snippet_Tag
s 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
放入片段模型的示例方法
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
试试before_update
?