我有三个模型,Artwork
,ArtworkTag
和Tag
,其中ArtworkTag
表示Artwork
和{{1}之间的m:n关系}。 Tag
仅存储代码名称,即Tag
。
从:tag
创建代码时,有必要首先查看ArtworkTagsController
表中是否存在:tag
,否则创建它,然后使用代码tags
在id
中建立关系。
下面你可以看到我直接从这个控制器调用ArtworkTag
,我认为这不是正确的做法。
如何正确分离关注点来处理这种情况?
Tag
答案 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])