处理具有非Rails常规命名的遗留系统。请注意,所有表和属性都是大写的,这在sqlserver适配器中意味着ID
与id
不同。
我曾认为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>
前几天我刚刚使用了alias_attribute。老实说,我一直在戳它,直到我开始工作。
我能够通过反转传递给alias_attribute的参数来实现您想要的功能。
示例:
alias_attribute :active?, :active
alias_attribute :alert, :message
alias_attribute :delete_at, :expire_at
其中第一个参数是列名,第二个参数是别名。我从文档中了解到这似乎是倒退的,但这就是我如何做到这一点的。
我通过配置DB适配器(MS SQL Server)将模式视为全小写来解决这种情况。因此,即使实际的DB表名可以是"USERS"、"PEOPLE"等,我也可以在我的应用程序中将它们引用为"USERS"、"PEOPLE"。
请参阅:https://github.com/rails-sqlserver/activerecord-sqlserver-adapter#force-架构到小写
以下是我为解决此问题而添加的代码:
# config/initializers/sql_server_adapter.rb
ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true