将 Rails 个应用程序连接到现有数据库
Connect Rails Application To Existing Database
我有一个客户要求我帮助他们构建一个 ruby 应用程序来连接数据库,该数据库是为 运行 在 php 上的另一个应用程序创建的。问题在于,由于数据库未使用 rails 构建,因此它不遵循任何 rails 约定。比如有一个叫form
的table
如果我 运行 命令 rails generate model form
那么 rails 将推断 table 名称是 forms
此外,我不希望 ruby 执行任何迁移,因为数据已经处于我想要的状态。有什么好的办法吗?
您无需 运行 迁移即可拥有该模型。跳过它们 (--no-migration
) 或在生成后删除文件。至于table个名字,看table_name=
。 primary_key=
也可以派上用场。
class Form << ActiveRecord::Base
self.table_name = 'form'
end
有一些选项可以使用遗留数据库。如果表格是单数的,您可以在 config/application.rb
中设置
config.active_record.pluralize_table_names = false
rails g model ModelName --migration=false
命令将完成这项工作,此命令将创建您的模型 ModelName
而无需迁移。
此外,您需要为每个模型指定真实的列名称:
Rails >= 3.2(包括Rails 4+):
class ModelName < ActiveRecord::Base
self.table_name = 'custom-table-name'
end
Rails <= 3.1:
class ModelName < ActiveRecord::Base
self.set_table_name 'custom-table-name'
end
照常在 config/database.yml
中指定连接详细信息
production:
adapter: mysql
host: somehost.somedomain.com
port: 3306
user: sqluser
password: **********
您可以为不符合 Rails 约定的 ActiveRecord 模型指定 table 名称,如下所示:
class Form < ActiveRecord::Base
self.table_name = 'tblForms_tbl'
end
如果有些列名很麻烦,比如保留字或者对ActiveRecord有特殊意义的列(比如"type"),那么你可以为它们设置自定义访问器,或者使用alias_attribute
.
class Form < ActiveRecord::Base
self.table_name = 'tblForms_tbl'
self.primary_key = 'formID'
self.inheritance_column = :_type_disabled
alias_attribute :formsTitle, :title
# use self.category as an accessor for the "type" column
def category=(type)
attr_writer :type, type
end
def category
attr_reader :type
end
end
我有一个客户要求我帮助他们构建一个 ruby 应用程序来连接数据库,该数据库是为 运行 在 php 上的另一个应用程序创建的。问题在于,由于数据库未使用 rails 构建,因此它不遵循任何 rails 约定。比如有一个叫form
如果我 运行 命令 rails generate model form
那么 rails 将推断 table 名称是 forms
此外,我不希望 ruby 执行任何迁移,因为数据已经处于我想要的状态。有什么好的办法吗?
您无需 运行 迁移即可拥有该模型。跳过它们 (--no-migration
) 或在生成后删除文件。至于table个名字,看table_name=
。 primary_key=
也可以派上用场。
class Form << ActiveRecord::Base
self.table_name = 'form'
end
有一些选项可以使用遗留数据库。如果表格是单数的,您可以在 config/application.rb
config.active_record.pluralize_table_names = false
rails g model ModelName --migration=false
命令将完成这项工作,此命令将创建您的模型 ModelName
而无需迁移。
此外,您需要为每个模型指定真实的列名称:
Rails >= 3.2(包括Rails 4+):
class ModelName < ActiveRecord::Base
self.table_name = 'custom-table-name'
end
Rails <= 3.1:
class ModelName < ActiveRecord::Base
self.set_table_name 'custom-table-name'
end
照常在 config/database.yml
production:
adapter: mysql
host: somehost.somedomain.com
port: 3306
user: sqluser
password: **********
您可以为不符合 Rails 约定的 ActiveRecord 模型指定 table 名称,如下所示:
class Form < ActiveRecord::Base
self.table_name = 'tblForms_tbl'
end
如果有些列名很麻烦,比如保留字或者对ActiveRecord有特殊意义的列(比如"type"),那么你可以为它们设置自定义访问器,或者使用alias_attribute
.
class Form < ActiveRecord::Base
self.table_name = 'tblForms_tbl'
self.primary_key = 'formID'
self.inheritance_column = :_type_disabled
alias_attribute :formsTitle, :title
# use self.category as an accessor for the "type" column
def category=(type)
attr_writer :type, type
end
def category
attr_reader :type
end
end