2

处理具有非 Rails 常规命名的遗留系统。请注意,所有表和属性都是大写的,这在 sqlserver-adapter 中表示IDid.

我原以为这alias_attribute :new, :OLD允许您指定一个可以在ActiveRecord/ActiveRelation查询中使用的名称。从我在下面看到的(在 中测试rails console)来看,情况并非如此。

最终目标是通过让每个模型都有一个ID属性等,让遗留系统在 Rails 传统方法中“行动”……

型号定义:

# app/models/organization.rb
class Organization < ActiveRecord::Base
  self.table_name = "ORGANIZATION"
  self.primary_key = "ORGANIZATION_ID"

  alias_attribute :id, :ORGANIZATION_ID
end

不工作:

Organization.select(:id)=>invalid column name 'id'

Organization.select(:ID)=>invalid column name 'ID'

Organization.select("ID")=>invalid column name 'ID'

是否有效:

Organization.select(:organization_id)=><finds record>

Organization.select(:ORGANIZATION_ID)=><finds record>

Organization.select("organization_id")=><finds record>

Organization.select("ORGANIZATION_ID")=><finds record>

4

2 回答 2

0

前几天我刚刚使用了 alias_attribute 。老实说,我一直在研究它,直到我开始工作。

通过反转传递给 alias_attribute 的参数,我能够实现您正在寻找的功能。

例子:

alias_attribute :active?, :active
alias_attribute :alert, :message
alias_attribute :delete_at, :expire_at

第一个参数是列名,第二个参数是别名。我知道这似乎从文档中倒退,但是这就是我让它工作的方式。

于 2014-09-25T19:55:41.447 回答
0

我通过配置 DB 适配器(MS SQL Server)将模式全部视为小写来解决了这种情况。因此,即使实际的数据库表名可以是“USERS”、“PEOPLE”等......,我也可以在我的应用程序中将它们引用为“users”、“people”。

请参阅:https ://github.com/rails-sqlserver/activerecord-sqlserver-adapter#force-schema-to-lowercase

这是我为解决此问题而添加的代码:

# config/initializers/sql_server_adapter.rb
ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true
于 2014-10-28T13:20:24.793 回答