Метод Rails model #attributes показывает вставленную ассоциацию драгоценного камня как атрибут модели - PullRequest
1 голос
/ 19 июня 2020

Я обновляю приложение Rails 4.2 до Rails версии 5.2. Мы используем гем acts_as_taggable_on (версия изменена с 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 исходит от драгоценного камня и, как ожидается, будет использоваться для установки и обновления связанных тегов.

В Rails 4.2 поведение соответствует ожиданиям. В Rails 5.2, поскольку этот дополнительный атрибут отображается как атрибут модели, он вызывает неожиданные проблемы в нескольких местах. 1015

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 определенно отсутствует в схеме модели, но все равно отображается как таковой.

Я не понимаю, как это решить. Ценю любую помощь!

1 Ответ

0 голосов
/ 19 июня 2020

Камень вызывает это, так как вы обновили 2 основные версии, было внесено много изменений. Возможно, эта строка вызывает https://github.com/mbleigh/acts-as-taggable-on/blob/950c01072b7ab6227d74dc0d0b112f0135281fc2/lib/acts_as_taggable_on/taggable/core.rb#L42. Вы можете либо изменить свой код для поддержки этого изменения, либо попробовать запустить старую версию gem, если она поддерживает Rails 5.

...