2

ユーザーがTagsに入力できるtext_fieldがあります(stackoverflowのものと同様)。タグはコンマで区切ることができます。これで、タグを分割する方法がわかりました。しかし、私がいるn00bは、次の段階で立ち往生しています。Tagテーブル、Tripテーブル、およびその間にtags_tripsがあります(Tripには複数のキーワードを含めることができますが、データベース内で一意のキーワードが必要なため、存在する場合は他のTripで再び使用できます)。

本当の問題は; 文字列を分割した後、キーワードが存在するかどうかを確認し、tags_tripsテーブルに配置する既存のIDを取得するにはどうすればよいですか。存在しない場合は、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の関連付けを使用しており、Tripフォームでhas_and_belongs_to_manytext_fieldを取得しています。fields_for :tags(注:フォームは機能し、入力されたキーワード文字列をタグテーブルに取得できました!分割しないでください;-))

前もって感謝します!

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 と Voila で行います。彼らは救われます。その後、tags_attributes を params[:trip] から削除して、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 に答える