Ruby on rails 作为标记在数据库中创建重复行
我正在使用acts作为Rails应用程序的标记,例如,每次我创建一张新照片时,我都会在“taggings”表中得到重复的行 我的模型类看起来像: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
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 %>