0

我有三个模型,ArtworkArtworkTagTag,其中表示和ArtworkTag之间的 m:n 关系。仅存储标签名称,即.ArtworkTagTag:tag

从 中创建标签时ArtworkTagsController,需要先查看表中是否:tag存在,tags如果不存在则创建,然后使用标签id在 中建立关系ArtworkTag

下面你可以看到我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

只有一行:(我不使用实例变量,因为我认为您不需要在视图中使用它,如果您只需将其更改为@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 回答