Rails activerecord - невозможно получить доступ к слагу столбца

Я решил добавить слаги к своим URL-адресам, я добавил столбец с именем «slug», создал миграцию, успешно перенес ее, проверил наличие столбца в базе данных:

введите здесь описание изображения

Но я не могу создавать записи, потому что получаю следующую ошибку:

NoMethodError: неопределенный метод `slug=' для #Hotel:0x3d19a60

Я использую библиотеку friendly_id, но эта проблема, вероятно, не связана с самой библиотекой. В любом случае, вот некоторые важные данные:

  • Версия Rails: 4.2.4
  • Версия Ruby: 2.1.7
  • Версия идентификатора друзей: 5.1.0
  • База данных: Postgres 9.3.5

Часть класса модели отеля:

class Hotel < ActiveRecord::Base
  extend FriendlyId
  friendly_id :generate_slug, use: :slugged

  def generate_slug
    "#{self.name} #{self.id}"
  end

  def should_generate_new_friendly_id?
    name_changed? || new_record?
  end

  def normalize_friendly_id(text)
    super(I18n.transliterate(text))
  end

Часть кода, где выдается ошибка при вызове сохранения (данные скрыты):

  rest = Hotel.new(:name => "*", :telephone => "*", :email => "*", :web_page => "*", :state => 1, :city_search => "*", :smoking => *,
                  :address_attributes => {:city => "*", :street => "*", :postal_code => "*", :country_code => "*"})
  ObjectSkipValidator.setup_validations(rest, nil)
  rest.save!

Конечно, в таблице есть столбец slug, моя миграция:

AFFECTED_TABLES = [:restaurants, :hotels]

  def change
    AFFECTED_TABLES.each do |tab|
      add_column tab, :slug, :string
      add_index tab, :slug, unique: true   
    end
  end

Я попытался переопределить ActiveRecord, чтобы увидеть, в чем проблема, и похоже, что хэш атрибутов, который необходим в методе attribute_missing, не содержит столбец «слаг», но все остальные столбцы присутствуют.

ActiveRecord::AttributeSet::Builder.build_from_database — при вызове значения не содержат краткий столбец

Также эта часть метода ActiveModel::AttributeMethods.method_missing:

match = match_attribute_method?(method.to_s)
match ? attribute_missing(match, *args, &block) : super

Никогда не вызывает attribute_missing, поэтому для этого конкретного столбца не создаются геттеры и сеттеры, потому что сопоставитель не смог найти столбец-слаг.

Итак, почему я не могу получить доступ или установить атрибут «slug» в своей модели? Спасибо за любые ответы.

РЕДАКТИРОВАТЬ: благодаря комментарию Шона похоже, что проблема возникла за несколько шагов до заполнения базы данных. В этой задаче выполняется заполнение - я использовал его в течение длительного времени без каких-либо проблем - во время задачи db: populate выдается ошибка:

task prepare_all: :environment do
  puts "==== PREPARING DATABASE ===="
  Rake::Task["db:drop"].invoke()
  Rake::Task["db:create"].invoke()
  Rake::Task["db:migrate"].invoke()
  Rake::Task["db:populate"].invoke()
  Rake::Task["db:codetables_populate"].invoke()
  Rake::Task["db:geocode"].invoke()
  puts "==== DATABASE PREPARED ===="
end

Задание выполняется с помощью:

bundle exec rake db:prepare_all RAILS_ENV=development

Если я запускаю задачи одну за другой, например. db:drop, db:create, db:migrate, db:populate, все работает как положено и создаются слаги. Похоже, вызов задач так, как я это делаю, неверен.


person Giron    schedule 08.04.2016    source источник
comment
Что возвращает Hotel.column_names.include?('slug')?   -  person Sean Huber    schedule 08.04.2016
comment
Он возвращает false - кстати, код для создания находится внутри задачи rake, я забыл упомянуть об этом.   -  person Giron    schedule 08.04.2016
comment
Что возвращает этот запрос: ActiveRecord::Base.connection.execute("SELECT version` FROM schema_migrations ORDER BY schema_migrations.version DESC LIMIT 1).first[0]` Какая отметка времени у вашей миграции? Какая версия определена в db/shema.rb? Вы уверены, что ваша среда Rails подключается к правильной базе данных?   -  person Sean Huber    schedule 08.04.2016
comment
Хм, это мне очень помогло... сначала я еще раз убедился, что я подключен к правильной базе данных, используя Rails.configuration.database_configuration[Rails.env], а затем я попробовал ваш выбор, и, к удивлению, он вернул ноль. Но когда я заглянул в базу данных, все миграции были там. Дело в том, что заполнение базы данных является частью более крупной задачи rake, которая полностью удаляет базу данных, воссоздает ее, мигрирует, а затем начинает заполнение.... но похоже, что есть что-то, что приводит к тому, что изменения не фиксируются или что-то в этом роде. как это. Я добавил свою задачу по грабли к вопросу.   -  person Giron    schedule 08.04.2016


Ответы (1)


Похоже, проблема была с самой задачей rake. Я не уверен в причине возникновения ошибки (почему последняя миграция не была добавлена), но она работает со следующей настройкой, если я удаляю и создаю базу данных вне задачи. Теперь задача выглядит так:

task prepare_all: :environment do
  puts "==== PREPARING DATABASE ===="
  Rake::Task["db:migrate"].invoke
  Rake::Task["db:reset"].invoke
  Rake::Task["db:populate"].invoke
  Rake::Task["db:codetables_populate"].invoke
  Rake::Task["db:geocode"].invoke
  puts "==== DATABASE PREPARED ===="
end
person Giron    schedule 08.04.2016