0

Railsを使用してデータにアクセスするレガシーアプリをMS-SQLからPostgresに移動しています。

MS-SQL の列は大文字で表記され、activerecord-sql-server-adapter を使用している間は、次のように読み取られます。

var something = my_model.SomeAttribute

定数ですが、アプリは MSSQL データベースからのみデータを読み取るため、問題にはなりません。

私が今抱えている問題は、postgresに移行した後、すべての列名などを小文字に変換することです(SQLは大文字と小文字を区別するものではないため)。モデルにアクセスしようとすると、小文字になったのでSomeAttributean が発生します。ActiveModel::MissingAttributeError

症状の例:

p.SomeAttribute
=> ActiveModel::MissingAttributeError: missing attribute: SomeAttribute

p.read_attribute(:SomeAttribute)
=> nil

p.has_attribute?(:SomeAttribute)
=> false

p.read_attribute(:someattribute)
=> 'expected value'

それらを取得しようとする前に、属性名を小文字に変換するように ActiveRecord/ActiveModel を取得する方法はありますか?

4

2 に答える 2

0

私は現在、Rails を使用してレガシー MS SQL Server データベースに接続する 2 つの異なるプロジェクトに取り組んでいます...テーブル名と列名が Rails が期待するものと一致しません。

私の最近のプロジェクトでは、金の卵を見つけたと思います:-)そして、それはRails側で何も変更せずに物事を機能させることです-金の卵は、SQLビューを使用してレガシーを「変換」することですテーブルをRailsが理解できるものに変換する - 私は現在開発中のプロジェクトを持っており、これが素晴らしく機能している場所に取り組んでおり、Rails側でテーブルや列の名前を試したりエイリアスしたりする必要はありません。私のRailsアプリに到達するまでには桃色です。最初のプロジェクトで取り組むべき多くの問題があり、これにより他の多くの人の生活がはるかに楽になると思うので、今これを投稿しています。

たとえば、Microsoft SQL Server 2008R2 に "Contact-Table" という名前のレガシー テーブルがあり、次のような奇妙な列名が付けられているとします。

Contact-Table:
    ID_Primary
    First Name
    Last Name

MS SQL テーブル ビューを使用すると、この同じテーブルを「再作成」できます。Legacy-Table に基づいてビューを作成します。Railsで「テーブル」と呼ばれる名前をビューに付け、列のエイリアスを使用して列の名前を変更します。したがって、ここでは、次の列を持つ "contacts" というビューを (Rails の規則に合わせて) 作成できます。

contacts:
    id             (alias for ID_Primary)
    first_name     (alias for First Name)
    last_name      (alias for Last Name)

次に、Rails モデルで、MS SQL の「連絡先」テーブルにリンクするだけで、列名が期待どおりに利用可能になります。これまでのところ、これを行っており、tiny-tds gem と free-tds で動作します。レコードのクエリ、作成、更新ができ、Rails の関連付け (has_many/belongs_to など) も機能します。Rails がレガシー データベースと通信できるようにするために、これまで使用してきた他の方法ではなく、MS SQL テーブル ビューを使用できることに非常に興奮しています。他の人の意見を聞きたいです。

于 2015-04-06T22:02:17.657 に答える
0

免責事項: これは非常に一時的な解決策であり、「正しい」ことではありません。

次のようなビューを作成しました。

CREATE VIEW mymodel AS
    SELECT
        at.someattribute
        , at.someattribute AS "SomeAttribute"
    FROM actual_table at

SQL で二重引用符を使用すると、大文字と小文字が保持されます。

于 2013-04-18T02:55:02.880 に答える