首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个访问两个模型的控制器中创建逻辑

在一个访问两个模型的控制器中创建逻辑
EN

Stack Overflow用户
提问于 2012-11-14 03:21:14
回答 2查看 69关注 0票数 0

我有三个模型,ArtworkArtworkTagTag,其中ArtworkTag表示ArtworkTag之间的m:n关系。Tag只存储标记名,即:tag

在从ArtworkTagsController创建标记时,有必要首先查看:tag是否存在于tags表中,如果不存在,则创建它,然后使用标记idArtworkTag中建立关系。

下面您可以看到,我直接从这个控制器调用Tag,我认为这不是正确的做法。

在适当分离关注点的情况下,我应该如何处理这种情况?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-14 04:46:40

我会这样做:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-11-14 04:17:53

我不确定我是否理解你的问题,但是你可以使用first_or_create方法来检查记录是否已经存在,如果不存在,它将创建新的记录。您可以替换以下内容:

代码语言:javascript
复制
@tag = Tag.find_by_tag(tag)

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

只有一行:(我没有使用实例变量,因为我认为你不需要在视图中使用它,如果你只需要将它更改为@tag,在params中更改为tag_id: @tag.id)

代码语言:javascript
复制
tag = Tag.where(tag: tag).first_or_create()

我看到你定义了artwork_tag,但是为什么你不使用它呢?我认为你可以替换:

代码语言:javascript
复制
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

使用以下代码:

代码语言:javascript
复制
params = { artwork_tag: { 
                          tag_id: tag.id, 
                          artwork_id: artwork_id, 
                          user_id: user_id  } }
@artwork_tag = ArtworkTag.create(params[:artwork_tag])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13367272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档