Rails 模型 #attributes 方法显示 gem 插入的关联作为模型属性
Rails model #attributes method shows gem inserted association as model attribute
我正在将 Rails 4.2 应用程序升级到 Rails 5.2 版。我们正在使用 acts_as_taggable_on
gem(版本从 4 更改为 6)来实现标记功能。
假设我有一个名为 Task 的模型。如果我这样做 Task.new
,我会得到下面的初始化对象。
=> #<Task:0x00003fh7398rcg3
id: nil,
title: nil,
description: nil,
creator_id: nil,
due_date: nil
status: "active",
created_at: nil,
updated_at: nil>
如果我这样做 Task.new.attributes
,我得到
{"id"=>"nil,
"title"=>"nil,
"description"=>"nil,
"creator_id"=>"nil,
"due_date"=>"nil
"status"=>""active",
"created_at"=>"nil,
"updated_at"=>"nil,
"tag_list"=>nil}
此 tag_list
来自 gem,预计将用于设置和更新相关标签。
在 Rails 4.2 上,行为符合预期。在 Rails 5.2 中,由于此附加属性显示为模型属性,因此会在多个位置引起意外问题。
我去看了一下,发现 ActiveRecord::ModelSchema 发生了变化,这可能是原因。
在我这样做的同时,我在任务模型上做了一个强制加载模式。
Task.send(:load_schema!)
输出:
{
"id"=>#<ActiveRecord::Type::UnsignedInteger:0x00007fc89f01d780 @limit=4, @precision=nil, @range=0...4294967296, @scale=nil>,
"title"=>#<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x00007fc89f0245f8 @limit=610, @precision=nil, @scale=nil>,
"description"=>#<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x00007fc8ab906d40 @limit=1000, @precision=nil, @scale=nil>,
"creator_id"=>#<ActiveRecord::Type::UnsignedInteger:0x00007fc89f01d780 @limit=4, @precision=nil, @range=0...4294967296, @scale=nil>,
"due_date"=>#<ActiveRecord::Type::DateTime:0x00007fc8ab90a5d0 @limit=nil, @precision=0, @scale=nil>,
"status"=>#<ActiveRecord::Enum::EnumType:0x00007fc8a0341870 @mapping={"active"=>0,
"complete"=>1}, @name="status", ,@scale=nil>,@subtype=#<ActiveModel::Type::Integer:0x00007fc8ab908370 @limit=1, @precision=nil, @range=-128...128, @scale=nil>>,
"created_at"=>#<ActiveRecord::Type::DateTime:0x00007fc8ab90a5d0 @limit=nil, @precision=0, @scale=nil>,
"updated_at"=>#<ActiveRecord::Type::DateTime:0x00007fc8ab90a5d0 @limit=nil, @precision=0, @scale=nil>
"tag_list"=>#<ActsAsTaggableOn::Taggable::TagListType:0x00007fc89fe9e840 @limit=nil, @precision=nil, @scale=nil>
}
当我尝试通过 Task._default_attributes
查看默认属性时,我仍然看到 tag_list 属性。
"tag_list"=>
#<ActiveModel::Attribute::WithCastValue:0x00007fc8a03409c0
@name="tag_list",
@original_attribute=nil,
@type=#<ActsAsTaggableOn::Taggable::TagListType:0x00007fc89fe9e840 @limit=nil, @precision=nil, @scale=nil>,
@value_before_type_cast=nil>}>
tag_list
绝对不在模型架构中,但它无论如何都会显示。
我不知道如何解决这个问题。感谢任何帮助!
gem 是造成这种情况的原因,因为您升级了 2 个主要版本,所以进行了很多更改。可能是这条线导致了它 https://github.com/mbleigh/acts-as-taggable-on/blob/950c01072b7ab6227d74dc0d0b112f0135281fc2/lib/acts_as_taggable_on/taggable/core.rb#L42。
您的选择是要么更改您的代码以支持此更改,要么尝试 运行 较旧的 gem 版本(如果它支持 Rails 5.
我正在将 Rails 4.2 应用程序升级到 Rails 5.2 版。我们正在使用 acts_as_taggable_on
gem(版本从 4 更改为 6)来实现标记功能。
假设我有一个名为 Task 的模型。如果我这样做 Task.new
,我会得到下面的初始化对象。
=> #<Task:0x00003fh7398rcg3
id: nil,
title: nil,
description: nil,
creator_id: nil,
due_date: nil
status: "active",
created_at: nil,
updated_at: nil>
如果我这样做 Task.new.attributes
,我得到
{"id"=>"nil,
"title"=>"nil,
"description"=>"nil,
"creator_id"=>"nil,
"due_date"=>"nil
"status"=>""active",
"created_at"=>"nil,
"updated_at"=>"nil,
"tag_list"=>nil}
此 tag_list
来自 gem,预计将用于设置和更新相关标签。
在 Rails 4.2 上,行为符合预期。在 Rails 5.2 中,由于此附加属性显示为模型属性,因此会在多个位置引起意外问题。
我去看了一下,发现 ActiveRecord::ModelSchema 发生了变化,这可能是原因。
在我这样做的同时,我在任务模型上做了一个强制加载模式。
Task.send(:load_schema!)
输出:
{
"id"=>#<ActiveRecord::Type::UnsignedInteger:0x00007fc89f01d780 @limit=4, @precision=nil, @range=0...4294967296, @scale=nil>,
"title"=>#<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x00007fc89f0245f8 @limit=610, @precision=nil, @scale=nil>,
"description"=>#<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x00007fc8ab906d40 @limit=1000, @precision=nil, @scale=nil>,
"creator_id"=>#<ActiveRecord::Type::UnsignedInteger:0x00007fc89f01d780 @limit=4, @precision=nil, @range=0...4294967296, @scale=nil>,
"due_date"=>#<ActiveRecord::Type::DateTime:0x00007fc8ab90a5d0 @limit=nil, @precision=0, @scale=nil>,
"status"=>#<ActiveRecord::Enum::EnumType:0x00007fc8a0341870 @mapping={"active"=>0,
"complete"=>1}, @name="status", ,@scale=nil>,@subtype=#<ActiveModel::Type::Integer:0x00007fc8ab908370 @limit=1, @precision=nil, @range=-128...128, @scale=nil>>,
"created_at"=>#<ActiveRecord::Type::DateTime:0x00007fc8ab90a5d0 @limit=nil, @precision=0, @scale=nil>,
"updated_at"=>#<ActiveRecord::Type::DateTime:0x00007fc8ab90a5d0 @limit=nil, @precision=0, @scale=nil>
"tag_list"=>#<ActsAsTaggableOn::Taggable::TagListType:0x00007fc89fe9e840 @limit=nil, @precision=nil, @scale=nil>
}
当我尝试通过 Task._default_attributes
查看默认属性时,我仍然看到 tag_list 属性。
"tag_list"=>
#<ActiveModel::Attribute::WithCastValue:0x00007fc8a03409c0
@name="tag_list",
@original_attribute=nil,
@type=#<ActsAsTaggableOn::Taggable::TagListType:0x00007fc89fe9e840 @limit=nil, @precision=nil, @scale=nil>,
@value_before_type_cast=nil>}>
tag_list
绝对不在模型架构中,但它无论如何都会显示。
我不知道如何解决这个问题。感谢任何帮助!
gem 是造成这种情况的原因,因为您升级了 2 个主要版本,所以进行了很多更改。可能是这条线导致了它 https://github.com/mbleigh/acts-as-taggable-on/blob/950c01072b7ab6227d74dc0d0b112f0135281fc2/lib/acts_as_taggable_on/taggable/core.rb#L42。 您的选择是要么更改您的代码以支持此更改,要么尝试 运行 较旧的 gem 版本(如果它支持 Rails 5.