2

我有一个文本字段,用户可以输入标签(就像 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

has_and_belongs_to_many在我的模型中使用 Tag 和 Trip 之间的关联,并fields_for :tags在我的 Trip 表单中获取 text_field。(注意:表单有效,并且我设法将键入的关键字字符串输入到我的标记表中!只是没有分开;-))

提前致谢!

4

2 回答 2

1

如果您希望标签的标题在整个应用程序中是唯一的,则需要在表上设置唯一性索引。除此之外, has_and_belongs_to_many 有一个 :uniq 字段,当设置为 true 时,将忽略重复。如果仍然不能解决问题,请在创建标签时尝试使用 find_or_create_by_title 助手。

于 2012-11-01T09:50:19.470 回答
0

我已经想通了。我不确定这是否是最好的方法,但它有效!这就是我所做的:如果存在,我会遍历 params[:trip][:tag_attributes]。并再次循环遍历它,同时用逗号分隔它。比在循环中我find_or_create_by对trip.tags 和瞧!他们得救了。之后,我从 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
于 2012-11-06T12:12:39.990 回答