2016-04-08 2 views
0

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

enter image description here

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

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, он работает так, как ожидалось, и пули создаются. Это похоже на вызов задач таким образом, что я делаю это неправильно.

+0

Что означает 'Hotel.column_names.include? ('Slug')' return? –

+0

Он возвращает false - Кстати, код для создания находится внутри задачи rake, я забыл упомянуть об этом. – Giron

+0

Что возвращает этот запрос: 'ActiveRecord :: Base.connection.execute (« SELECT 'version' FROM' schema_migrations' ORDER BY 'schema_migrations'.'version' DESC LIMIT 1"). First [0] 'Какая временная метка миграция? Какую версию вы видите в 'db/shema.rb'? Вы уверены, что ваша среда Rails подключается к правильной базе данных? –

ответ

0

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

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 
Смежные вопросы