2016-02-25 4 views
0

Оригинальный код выглядит следующим образом:переименовывать существующие рельсы модели и добавить пространство имен

# app/models/sso_configuration.rb 
class SsoConfiguration < ActiveRecord::Base 
end 

# db/schema.rb 
create_table "sso_configurations", force: true do |t| 
    ... 
end 

Я должен переименовать модель и добавить пространство имен, так что я буду иметь Sso::SamlConfiguration. Я изменил модель и таблицу базы данных.

# db/migrate20160225144615_rename_sso_configurations_to_sso_saml_configurations.rb 
class RenameSsoConfigurationsToSsoSamlConfigurations < ActiveRecord::Migration 
    def change 
    rename_table :sso_configurations, :sso_saml_configurations 
    end 
end 

# db/schema.rb 
create_table "sso_saml_configurations", force: true do |t| 
    ... 
end 

# app/models/sso/saml_configuration.rb 
module Sso 
    class SamlConfiguration < ActiveRecord::Base 
    end 
end 

Когда я открываю консоль рельсов, происходит следующее.

> Sso::SamlConfiguration 
=> Sso::SamlConfiguration(Table doesn't exist) 
> Sso::SamlConfiguration.new 
=> PG::UndefinedTable: ERROR: relation "saml_configurations" does not exist 

Моей первоначальная мысль была, что Namespaced модель должна, по соглашению, имеет название snakecase в качестве имени таблицы таким образом, что Foo::Bar должны иметь соответствующую foo_bars таблицы. Я что-то упустил с настройкой?

+0

Я посмотрел на название разделяет пространства имен модели, 'класса SSO :: SamlConfiguration Patrick

ответ

0

я понял, решение, копируя то, что рельсы будут делать, если я позволить ей сгенерировать пространство имен модели для меня

rails g model sso/test 

invoke active_record 
create db/migrate/20160226074853_create_sso_tests.rb 
create app/models/sso/test.rb 
create app/models/sso.rb 
invoke rspec 
create  spec/models/sso/test_spec.rb 
invoke  factory_girl 
create  spec/factories/sso_tests.rb 

Я проверил все соглашения о пути и имени в этих новых файлах, и единственным, что я пропустил, был файл app/models/sso.rb.

Создание следующей решить мою проблему:

# app/models/sso.rb 
module Sso 
    def self.table_name_prefix 
    'sso_' 
    end 
end 

Тогда

rails d model sso/test 
0

rename_table :sso_configurations, :sso_saml_configurations

означало бы это SsoSamlConfiguration.all, когда вы пытаетесь сделать это Sso::SamlConfiguration.all

Просто откатить миграцию и изменить эту линию

rename_table :sso_configurations, :sso_saml_configurations 

этой

rename_table :sso_configurations, :saml_configurations 

и теперь это должно работа

Sso::SamlConfiguration.all 
0

PG::UndefinedTable: ERROR: relation "saml_configurations" does not exist

Rails по умолчанию выглядит для таблицы, имя которого множественного имени из модели, то есть в вашем случае это выглядит для saml_configurations как название модели saml_configuration.

Вам необходимо явно отобразить модель в другую таблицу с помощью self.table_name

# app/models/sso/saml_configuration.rb 
module Sso 
    class SamlConfiguration < ActiveRecord::Base 
    self.table_name = "sso_saml_configurations" 
    end 
end 
Смежные вопросы