2011-07-16 3 views
2

基本的に、私のウェブアプリケーションには、データベースに多数の初期データをシードすることです。たとえば、すべてが1つのproduct_typeを持つ製品のリストがあります。データをシードする際にIDを見つける

私seeds.rbは、次のコードを持っています

ProductType.delete_all 
ProductType.create(:name => 'Furniture') 

Product.delete_all 
Product.create(:name => 'Chair', :type_id => ProductType.first.id, :packaging => '2 for $20', :price_per => 0.1, :default_packaging_number => 2) 

は今、私の問題はProductType.first.idは単なるプレースホルダであるということです。問題は、私がこれを行うとき、私ははっきりIDではありません膨大な数(70247318042560)に戻ってしまうことがあり

:type_id => ProductType.where(:name => "Furniture").id 

:私が本当にやりたいことのようなものを置くことです。私はどこ文の末尾に.object_idを使用すると、コンソールにも警告

warning Object#id will be deprecated; use Object#object_id 

を返し、それはまだ同じ大と間違った番号ことを返します。

家具ProductTypeのIDをデータベースから取得するにはどうすればよいですか?アクセス権を変更する必要がありますか?

+0

方法でProductType 'について。:(:name => "Furniture")。first.id'? – user482594

答えて

4

まず:

あなたはその結果セットの1つのレコードのみがあります場合でも、基本的には結果の配列であるActiveRecordの関係を、取得しているProductType.where()呼び出します。

ProductType.where(...whatever...).first.idに電話して問題が解決するかどうかを確認してください。

次に、より良い方法:

製品をローカル変数に保存するだけです。

ProductType.delete_all 
furniture = ProductType.create(:name => 'Furniture') 

Product.delete_all 
Product.create(:name => 'Chair', :type => furniture, :packaging => '2 for $20', :price_per => 0.1, :default_packaging_number => 2) 

正しいアソシエーション名(タイプを推測しています...)を使用していることを確認してください。

ActiveRecordは、多態性と単一テーブルの継承関係に「型」列を既に使用しています。製品とProductTypesの関係が「タイプ」と呼ばれる関連付けが設定されている場合は、競合が発生している可能性があります。または、将来競合する可能性があります。これを列名として使用しないのが最善です。

なぜデフォルトに固執するのですか? Product belongs_to ProductType場合、デフォルトの列名は次のようになりproduct_type_id

最終代替:あなたは(おそらく良いアイデア)をシードするとき、あなたは、あなたがProduct.delete_allを呼び出す必要はありません、あなたのDBをリセットすると

、DBはすでにます空である。

その場合、ProductType.find(1)を実行することができます。レコードの作成を開始したばかりの場合、IDは1,2,3などの順序で作成されます。

希望すると、お気軽に質問してください。

+0

上記の編集では、最初の文章で誤って "array"という単語を除外し、列名についての詳細を追加しました。 – Andrew

+0

答えをありがとう。好奇心から、あなたはそれがProduct belongs_to ProductTypeであるべきだと言いました...私がこれをしたのは、ProductがProductTypeを1つ持ち、ProductTypeがProductに属していると書いたことでした。この論理は間違っていますか?私はちょうどあなたがhas_oneの<-> belongs_toのをやっている場合、それは本当に低「を有する」として設定より高いレベルのモデルを重要ではなく、一般的に、あなたはありません – jyanks

+0

...製品は1でProductTypeを持っており、販売に属していると考えましたすなわち、カテゴリはアイテムを「持っている」、アイテムはカテゴリに「属し」、他の方法ではない。 – Andrew

1

は次のようになります。

:type_id => ProductType.where(:name => "Furniture").first.id 

ばかり行く新しく作成されたアイテムのIDを取得するには:

@product = Product.create(:name => 'Chair', :type_id => ProductType.first.id, :packaging => '2 for $20', :price_per => 0.1, :default_packaging_number => 2) 
@product.id 
0

おそらくこれはあなたのために動作します:

:type_id => ProductType.where(:name => "Furniture").find(:select => 'id') 
関連する問題