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

时间:2012-11-13 19:21:14

标签: ruby-on-rails ruby-on-rails-3

我有三个模型,ArtworkArtworkTagTag,其中ArtworkTag表示Artwork和{{1}之间的m:n关系}。 Tag仅存储代码名称,即Tag

:tag创建代码时,有必要首先查看ArtworkTagsController表中是否存在:tag,否则创建它,然后使用代码tagsid中建立关系。

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

如何正确分离关注点来处理这种情况?

Tag

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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])