2011-12-29 7 views
1

私は、製品の価格のための私の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テーブルを指しているかのようにすべてが突然動作します。

答えて

0

プライスモデルでhas_oneリレーションシップを設定しているかのようにフィールドを偽装したい場合は、プライスモデルで自分でメソッドを定義できます。 Product Structから選択する方法の例を示していないので、ActiveModel用に再実装しようとした場合のコード例を以下に示します。

def product 
    if self.product_id 
     if [email protected] or @product.id != self.product_id 
      @product = Product.find(self.product_id) 
     else 
      @product 
     end 
    end 
end 

def product=(product) 
    @product = product 
    self.product_id = product._id 
end 

これは、あなたがproductまたはproduct_idを通してそれを設定することで、それを変更することができますhas_one関係を複製し、それが変更された場合にのみ再び一度製品を検索し、します。

+0

これはうまくいきましたが、もう少ししなければなりませんでした。つまり、validates_uniqueness_of呼び出しをproduct:product_idから変更する必要があり、ActiveRecord検索呼び出しでproductの代わりにproduct_id(find_by_product_id_and_country_codeなど)を使用する必要がありました。それ以外は、これが私が必要としていた鍵でした。 – Jon

関連する問題