0

ArtworkArtworkTag、およびの3 つのモデルがあります。Tagここで、ArtworkTagと の間の m:n 関係を表します。タグ名のみを保存します。ArtworkTagTag:tag

からタグを作成する場合は、まずテーブルにが存在するArtworkTagsControllerかどうかを確認し、存在しない場合は作成し、タグを使用して で関係を作成する必要があります。:tagtagsidArtworkTag

以下では、このコントローラーから直接呼び出していることがわかりますがTag、これは正しい方法ではないと思います。

懸念事項を適切に分離して、この状況をどのように処理する必要がありますか?

def create
  tag = params[:artwork_tag][:tag].downcase
  @tag = Tag.find_by_tag(tag)

  if @tag.blank?
    @tag = Tag.new(:tag => tag)
    @tag.save
  end

  artwork_id = params[:artwork_tag][:artwork_id]
  user_id = params[:artwork_tag][:user_id]

  artwork_tag = {
    "tag_id" => @tag.id,
    "artwork_id" => artwork_id,
    "user_id" => user_id
  }

  @artwork_tag = ArtworkTag.new(:tag_id => @tag.id, :artwork_id => artwork_id, :user_id => user_id)
  @artwork_tag.save
  respond_to do |format|
    format.json { render :json => {
      "id" => @artwork_tag.id, "tag" => @tag.tag, "artwork_id" => artwork_id },
      :status => :created }
  end
end
4

2 に答える 2

1

私はこのようなことをします:

def create
  artwork_tag = ArtworkTag.create(
    :tag => Tag.find_or_create_by_tag(params[:artwork_tag][:tag].downcase),
    :artwork_id => params[:artwork_tag][:artwork_id],
    :user_id => params[:artwork_tag][:user_id]
  )

  respond_to do |format|
    format.json { render :json => { :artwork_tag => artwork_tag } }
  end
end
于 2012-11-13T20:46:40.127 に答える
0

あなたの質問を理解できるかどうかわかりませんが、first_or_createメソッドを使用して、レコードが既に存在するかどうかを確認できます。そうでない場合は、新しいレコードが作成されます。これを置き換えることができます:

@tag = Tag.find_by_tag(tag)

if @tag.blank?
  @tag = Tag.new(:tag => tag)
  @tag.save
end

1行のみ:(インスタンス変数を使用していません。なぜなら、それを変更する必要がある場合は、ビューで使用する必要がないと思うから@tagですtag_id: @tag.id

tag = Tag.where(tag: tag).first_or_create()

を定義artwork_tagしたようですが、なぜそれを使用しないのですか? 私はあなたが置き換えることができると思います:

artwork_tag = {
  "tag_id" => @tag.id,
  "artwork_id" => artwork_id,
  "user_id" => user_id
}

@artwork_tag = ArtworkTag.new(:tag_id => @tag.id, :artwork_id => artwork_id, :user_id => user_id)
@artwork_tag.save

このコードで:

params = { artwork_tag: { 
                          tag_id: tag.id, 
                          artwork_id: artwork_id, 
                          user_id: user_id  } }
@artwork_tag = ArtworkTag.create(params[:artwork_tag])
于 2012-11-13T20:17:52.650 に答える