将 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