я решил добавить слизень к моему URL, я добавил столбец с именем «слизняк», созданная миграцией, успешно перенести его, проверить существование столбца в базе данных:Rails ActiveRecord - не могут получить доступ к колонку пробкового
Но я не могу создавать записи, потому что я получаю следующее сообщение об ошибке:
NoMethodError: неопределенный метод `пробкового =» для #Hotel: 0x3d19a60
Я использую библиотеку friendly_id, но эта проблема, вероятно, не связана с самой библиотекой. Во всяком случае здесь некоторые важные данные:
- Rails версии: 4.2.4
- Рубин Версия: 2.1.7
- Frienldy версия ID: 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!
Конечно таблица имеет пробковые колонки, моя миграция:
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, чтобы я мог видеть, где проблема, и похоже, что атрибут hash, который необходим в методе attribute_missing, не содержит столбца «slug», но все остальные r столбцов.
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.
Так почему я не могу получить доступ или установить атрибут «slug» на моей модели? Спасибо за любые ответы.
EDIT: Благодаря замечанию Шона, похоже, проблема в некоторых шагах перед населением базы данных.Население делается в этой задаче - я использовал его в течение длительного времени без каких-либо проблем - ошибка возникает при дб: заселить задача:
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, он работает так, как ожидалось, и пули создаются. Это похоже на вызов задач таким образом, что я делаю это неправильно.
Что означает 'Hotel.column_names.include? ('Slug')' return? –
Он возвращает false - Кстати, код для создания находится внутри задачи rake, я забыл упомянуть об этом. – Giron
Что возвращает этот запрос: 'ActiveRecord :: Base.connection.execute (« SELECT 'version' FROM' schema_migrations' ORDER BY 'schema_migrations'.'version' DESC LIMIT 1"). First [0] 'Какая временная метка миграция? Какую версию вы видите в 'db/shema.rb'? Вы уверены, что ваша среда Rails подключается к правильной базе данных? –