私は、製品の価格のための私のRailsアプリで構築していたモデルを持って次のようにActiveRecordアトリビュートを外乱の少ない状態で外部キーに再マッピングするにはどうすればよいですか?
class Price < ActiveRecord::Base
validates_presence_of :country_code, :product, :amount
validates_uniqueness_of :product, :scope => [:country_code]
end
が適切に、DBモデルは次のとおりです。
create_table :prices do |t|
t.string :country_code
t.integer :product_id
t.integer :amount
end
合併症で、ということですProductは実際のActiveRecordモデルではありません。多くの定数とヘルパーメソッドを持つ単一のID属性(item_code)をラップしたStructです。将来のスプリントではデータベースを適切にリファクタリングする計画がありますが、今のところ、アプリケーションコードの多くは、既にDBから来ているかのようにProductを使用しています。理想的には、 Productは、DB内で直接の関係を持つモデルだけに適したテーブルになります。
問題は、基礎となるDBに実際の他のテーブルがない場合、モデル内の外部キー関係をきれいに処理することです。
validates_inclusion_of :product, :in => Product.all
Product.allは実際のActiveRecordクラスせずにテーブルからこれらのオブジェクトをシミュレートする方法である。論理的にそれを回避するために、私は価格に次の検証を追加しました。
これはすべて、私が理解する限り、Productテーブルがないため、ActiveRecordが作成していないという問題につながります。つまり、プロダクトアクセサが(代わりに:product_idを直接使用しています)。しかし、私がproduct_idに依存している場合、Productが実際のActiveRecordクラスになると、移行するのが難しくなりました。
:product属性を「product_id」フィールドに 'エイリアスする'という簡単な方法があります。これにより、コードがProduct(またはPriceモデル)内で分離され、すべての目的や目的に対して、 :データベーステーブルに関係があるかのように、製品が自動的にマッピングされますか?理想的な解決法は明らかに、将来のある日に削除することができるいくつかのメソッドまたはエイリアス命令であり、product_idが常にproductsテーブルを指しているかのようにすべてが突然動作します。
これはうまくいきましたが、もう少ししなければなりませんでした。つまり、validates_uniqueness_of呼び出しをproduct:product_idから変更する必要があり、ActiveRecord検索呼び出しでproductの代わりにproduct_id(find_by_product_id_and_country_codeなど)を使用する必要がありました。それ以外は、これが私が必要としていた鍵でした。 – Jon