拆分字符串并使用has_and_belongs_to_many关联保存

时间:2012-11-01 09:23:03

标签: ruby-on-rails ruby-on-rails-3 has-and-belongs-to-many

我有一个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。 (注意:表格有效,我已经设法将关键字字符串输入到我的标签表中,因为它是键入的!只是不拆分; - ))

提前致谢!

2 个答案:

答案 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