Ruby on rails 作为标记在数据库中创建重复行

Ruby on rails 作为标记在数据库中创建重复行,ruby-on-rails,ruby,acts-as-taggable-on,Ruby On Rails,Ruby,Acts As Taggable On,我正在使用acts作为Rails应用程序的标记,例如,每次我创建一张新照片时,我都会在“taggings”表中得到重复的行 我的模型类看起来像: class User < ActiveRecord::Base acts_as_tagger ... end 奇怪的是,我在“taggings”表中得到了重复的行,其中第一行的“tagger_id”和“tagger_type”设置为NULL,而重复的行具有正确的值 我的档案是这样的 gem 'rails', '3.2.8' gem 'a

我正在使用acts作为Rails应用程序的标记,例如,每次我创建一张新照片时,我都会在“taggings”表中得到重复的行

我的模型类看起来像:

class User < ActiveRecord::Base
  acts_as_tagger
  ...
end
奇怪的是,我在“taggings”表中得到了重复的行,其中第一行的“tagger_id”和“tagger_type”设置为NULL,而重复的行具有正确的值

我的档案是这样的

gem 'rails', '3.2.8'
gem 'acts-as-taggable-on', '~> 2.3.1'
以前有人见过这种行为吗?这是我这边的配置问题吗

更新: 查看控制台,我可以清楚地看到正在执行的两个事务,在第一个事务中有:

SQL (0.6ms)  INSERT INTO "taggings" ("context", "created_at", "tag_id", 
"taggable_id", "taggable_type", "tagger_id", "tagger_type") VALUES (?, ?, ?, ?, ?, ?, ?)
[["context", "tags"], ["created_at", Thu, 27 Sep 2012 21:49:22 UTC +00:00], ["tag_id",
 12], ["taggable_id", 10], ["taggable_type", "Photo"], 
["tagger_id", nil], ["tagger_type", nil]]
很明显,tagger_id和tagger_type都设置为null

这是一个完整的控制台输出,我已将行分隔开以帮助阅读。您将注意到两个独立的事务,在第一个事务中有一个带有NULL值的insert,而在第二个事务的末尾,您将看到正确的事务

2012年9月28日07:39:58+0200开始发布127.0.0.1的帖子/照片 通过Photocontroller处理创建为HTML 参数:{utf8=>✓, 真实性\标记=>IOmnfDpU7V7vYw3h6RXXzXPsXf/B0fcVihXhb+S8JHU=,照片=>{url=>www.other.com/photo.jpg,title=>other,标记\列表=>a \标记,描述=>,私有=>0},提交=>Add photo} 重定向到

在414ms ActiveRecord中找到已完成的302:20.5ms

用户加载0.3ms选择用户。*来自用户,其中users.username='christangiacomi'限制为1 ACTSASTAGGALEON::Tag Load 0.2ms SELECT tags.*从tags内部连接taggings ON tags.id=taggings.taggable_id,其中taggings.taggable_id为NULL,taggings.taggable_type='Photo'和taggings.context='tags'和taggings.tagger_id为NULL

0.1ms开始事务

SQL 6.2ms插入到创建的照片中,地址、描述、收藏、私人、标题、更新的地址、url、用户id值?、?、?、?、?、?、?、?[[创建时间:2012年9月28日星期五05:39:59 UTC+00:00],[描述],[收藏夹,错误],[私人,错误],[标题,另一个],[更新时间:2012年9月28日星期五05:39:59 UTC+00:00],[url,http://www.another.com/photo.jpg],[user_id,1]]

ActsAsTaggableOn::Tag Load 3.2ms选择标记。*从标记中,lowername='a_标记' ACTSASTAGGALEON::标记存在0.1ms从标记中选择1,其中tags.name='a_Tag'限制1

SQL 0.2ms插入标记名称值[[name,a_标记]]

ACTSASTAGGALEON::Tag Load 0.1ms SELECT tags.*从tags内部连接taggings ON tags.id=taggings.taggable_id,其中taggings.taggable_id=13和taggings.taggable_type='Photo'和taggings.context='tags'和taggings.tagger_id为空

ActsAsTaggableOn::Tagging Exists 0.2ms从taggings.tag_id=16和taggings.taggable_type='Photo'和taggings.taggable_id=13和taggings.context='tags'和taggings.tagger_id为空且taggings.tagger_type为空限制1的标记中选择1

SQL 0.7ms插入到标记上下文中,在处创建,标记id,标记id,标记类型,标记id,标记类型,标记类型值?[[上下文,标记],[创建时间,2012年9月28日星期五05:39:59 UTC+00:00],[标记id,16],[标记id,13],[标记类型,照片],[标记id,无],[标记类型,无]]

4.1ms提交事务

0.1ms开始事务

ACTSASTAGGALEON::标记加载0.2ms选择标记。*从标记中,lowername='a_标记'

ACTSASTAGGALEON::Tag Load 0.2ms SELECT tags.*从tags内部连接taggings ON tags.id=taggings.taggable_id,其中taggings.taggable_id=13和taggings.taggable_type='Photo'和taggings.context='tags'和taggings.tagger_id为空

缓存0.0ms选择标记。*从标记中,lowername='a_标记'

ActSasTaggaleon::Tag Load 0.2ms SELECT tags.*从tags内部连接taggings ON tags.id=taggings.taggable_id,其中taggings.taggable_id=13和taggings.taggable_type='Photo'和taggings.context='tags'和 taggings.tagger_id=1和 taggings.tagger_type='User'

ActsAsTaggableOn::Tagging Exists 0.4ms从taggings.tag_id=16和taggings.taggable_type='Photo'和taggings.taggable_id=13和taggings.context='tags'和taggings.tagger_id=1和taggings.tagger_type='User'限制1的标记中选择1

SQL 0.5ms插入到标记上下文中,在处创建,标记id,标记id,标记类型,标记id,标记类型,标记类型值?[[上下文,标记],[创建时间,2012年9月28日星期五05:39:59 UTC+00:00],[标记id,16],[标记id,13],[标记类型,照片],[标记id,1],[标记类型,用户]]


2.4ms提交事务

好的,这真的很奇怪,但我已经找到了避免问题的方法

我做的第一件事是创建一个尖峰解决方案来测试acts as taggable,这似乎是可行的。它由两个模型类组成,就是这样。。。当我通过rails控制台测试它时,它工作了

因此,我添加了一个表单,就像我在rails应用程序中添加的一样,并再次测试了它

我有一个fo rm是这样的:

   <div>
      <%= form_for @photo, :html => { :class => "dialog" } do |f| %>

      ...

      <%= f.label :title%>
      <%= f.text_field :title, :class => "wide" %>

      <%= f.label 'Tags' %>
      <%= f.text_field :tag_list, :value => @tags %>

      ...

      <%= f.submit button_text(@photo), :class => "btn btn-large btn-primary" %>
      <%= f.submit "Cancel", :class => "btn btn-large"  %>
   </div>
这解决了错误,但当我测试它时,我发现重复的行现在出现了!所以现在这个错误是可以复制的

我通过更改表单来解决这个问题,这样就不会将表单绑定到照片模型对象

像这样:

<div>
   <%= form_tag({:controller => "photos", :action => "create"}, :method => "post", :class => "dialog") do %>

   ...

   <%= label_tag :title, 'Title'%>
   <%= text_field_tag :title, nil, :class => "wide" %>

   <%= label_tag :tag_list, 'Tags'%>
   <%= text_field_tag :tag_list, nil, :class => "wide" %>

   ...

   <%= submit_tag('Add', :class => "btn btn-large btn-primary") %>
   <%= submit_tag("Cancel", :class => "btn btn-large")  %>
</div>
这就解决了问题


现在,我将尝试调查这一切发生的确切原因!:

好吧,这真的很奇怪,但我已经找到了避免问题的方法

我做的第一件事是创建一个尖峰解决方案来测试acts as taggable,这似乎是可行的。它由两个模型类组成,就是这样。。。当我通过rails控制台测试它时,它工作了

因此,我添加了一个表单,就像我在rails应用程序中添加的一样,并再次测试了它

我有一张类似这样的表格:

   <div>
      <%= form_for @photo, :html => { :class => "dialog" } do |f| %>

      ...

      <%= f.label :title%>
      <%= f.text_field :title, :class => "wide" %>

      <%= f.label 'Tags' %>
      <%= f.text_field :tag_list, :value => @tags %>

      ...

      <%= f.submit button_text(@photo), :class => "btn btn-large btn-primary" %>
      <%= f.submit "Cancel", :class => "btn btn-large"  %>
   </div>
这解决了错误,但当我测试它时,我发现重复的行现在出现了!所以现在这个错误是可以复制的

我通过更改表单来解决这个问题,这样就不会将表单绑定到照片模型对象

像这样:

<div>
   <%= form_tag({:controller => "photos", :action => "create"}, :method => "post", :class => "dialog") do %>

   ...

   <%= label_tag :title, 'Title'%>
   <%= text_field_tag :title, nil, :class => "wide" %>

   <%= label_tag :tag_list, 'Tags'%>
   <%= text_field_tag :tag_list, nil, :class => "wide" %>

   ...

   <%= submit_tag('Add', :class => "btn btn-large btn-primary") %>
   <%= submit_tag("Cancel", :class => "btn btn-large")  %>
</div>
这就解决了问题


现在,我将尝试调查这一切发生的确切原因!:

我知道这个问题已经讨论了五年了,但在Rails 5.1中,这种情况仍然存在,并将acts作为taggable 4.0,我只是想向大家展示如何解决这个问题

这是一个非常简单的修复方法,在控制器中的强参数中,您只需添加标记列表:[],而不是像这样添加:标记列表:

这将阻止在数据库中创建重复标记和空白标记,并且您可以使用form_而不是form_标记


我知道这个问题已经讨论了五年了,但在Rails 5.1中仍然会出现这种情况,并将acts作为taggable 4.0,我只是想向大家展示如何解决这个问题

这是一个非常简单的修复方法,在控制器中的强参数中,您只需添加标记列表:[],而不是像这样添加:标记列表:

这将阻止在数据库中创建重复标记和空白标记,并且您可以使用form_而不是form_标记


你能粘贴第二个事务吗?zeikt,我在帖子中添加了整个控制台输出。请注意这两个独立的事务。你能粘贴第二个事务吗?zeikt,我在帖子中添加了整个控制台输出。请注意这两项单独的交易。
<div>
   <%= form_tag({:controller => "photos", :action => "create"}, :method => "post", :class => "dialog") do %>

   ...

   <%= label_tag :title, 'Title'%>
   <%= text_field_tag :title, nil, :class => "wide" %>

   <%= label_tag :tag_list, 'Tags'%>
   <%= text_field_tag :tag_list, nil, :class => "wide" %>

   ...

   <%= submit_tag('Add', :class => "btn btn-large btn-primary") %>
   <%= submit_tag("Cancel", :class => "btn btn-large")  %>
</div>
@photo = current_user.photos.build(:title => params[:title],
                                   ...
                                   )
@user.tag(@photo, :with => params[:tag_list], :on => :tags)
def photo_params
  params.require(:photo).permit(:title, tag_list: [])
end
<%= form_for @photo do |f| %>
  <%= f.text_field :title %>
  <%= f.text_field :tag_list %>
  <%= f.submit %>
<% end %>