我有三个模型,Artwork、ArtworkTag和Tag,其中ArtworkTag表示Artwork和Tag之间的m:n关系。Tag只存储标记名,即: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发布于 2012-11-14 04:46:40
我会这样做:
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-14 04:17:53
我不确定我是否理解你的问题,但是你可以使用first_or_create方法来检查记录是否已经存在,如果不存在,它将创建新的记录。您可以替换以下内容:
@tag = Tag.find_by_tag(tag)
if @tag.blank?
@tag = Tag.new(:tag => tag)
@tag.save
end只有一行:(我没有使用实例变量,因为我认为你不需要在视图中使用它,如果你只需要将它更改为@tag,在params中更改为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])https://stackoverflow.com/questions/13367272
复制相似问题