我有一个text_field,用户可以在Tags中键入(就像stackoverflow上的那些)。他们可以用逗号分隔标签。现在,我知道如何拆分标签。但是,我是n00b,我被困在下一阶段。我有一个Tag表,一个Trip表和一个tags_trips(一个旅行可以有多个关键字,但我希望我的数据库中的关键字是唯一的,所以当它们存在时,它们可以在其他旅行中再次使用)。
真正的问题是;在我拆分字符串之后,如何检查关键字是否存在并将现有ID放在我的tags_trips表中,如果它不存在,我如何得到数组我只是在我的tags_trips中拆分桌子一气呵成?
以下是我的表格概述:
Trip
:id => :integer,
:title => :string,
:description => :text,
:user_id => :integer,
:created_at => :datetime,
:updated_at => :datetime
Tag
:id => :integer,
:title => :string,
:created_at => :datetime,
:updated_at => :datetime
tags_trip
:tag_id => :integer,
:trip_id => :string
我在模型中使用了Tag和Trip之间的has_and_belongs_to_many
关联,并通过我的旅行表单中的fields_for :tags
获取text_field。 (注意:表格有效,我已经设法将关键字字符串输入到我的标签表中,因为它是键入的!只是不拆分; - ))
提前致谢!
答案 0 :(得分:1)
如果您希望标签的标题在整个应用程序中是唯一的,则需要在表格上设置唯一性索引。除此之外,has_and_belongs_to_many还有一个:uniq字段,当设置为true时,将忽略重复。如果仍然无法解决问题,请在创建标记时尝试使用find_or_create_by_title帮助程序。
答案 1 :(得分:0)
我已经弄清楚了。我不确定这是不是最好的方式,但它确实有效!这就是我所做的:
如果存在,我遍历params [:trip] [:tag_attributes]。然后再次循环它,同时将它分成逗号。比在循环中我在trip.tags和Voila上做find_or_create_by
!他们得救了。之后我删除了params [:trip]中的tags_attributes,因此它不会保存在update_Attributes上。 ChuckE,你得到了很棒的帮助,万分感谢!
代码:
def update
@trip = Trip.find(params[:id])
if params[:trip][:tags_attributes].present?
params[:trip][:tags_attributes].each do |tag|
@a = tag[1]['title']
@a.split(',').each do |single|
@trip.tags.create(:title => single)
end
end
end
#Delete the tags attributes from the trip array so it will not be saved.
params[:trip].delete('tags_attributes')
respond_to do |format|
if @trip.update_attributes(params[:trip])
format.html { redirect_to @trip, notice: 'Trip was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @trip.errors, status: :unprocessable_entity }
end
end
end