1

Rails でのこの「関連付け」ビジネスを完全に理解していないようです...誰かが助けてくれることを願っています。

モデルワン

class Vendor < ActiveRecord::Base
  has_many :products
end

モデル 2

class Product < ActiveRecord::Base
  belongs_to :vendor
end

現在サポートされているすべての「製品」を見つけて、そこにベンダー名を関連付けると...正しい結果が得られません。

Product.where("is_supported = true").joins(:vendor)

結果のクエリは次のとおりです。

 SELECT `products`.* FROM `products` INNER JOIN `vendors` ON `vendors`.`id` = `products`.`vendor_id` WHERE (is_supported = true)

問題は SELECT products.* ではなく SELECT * です。

vendor テーブルを独自のフィールドと products テーブルに結合させるには何が欠けていますか?

4

2 に答える 2

0

これは、JOIN を作成していて、同時に 2 つのテーブルを操作しているためです。次に、レールは特定のクエリを作成します。

于 2012-11-13T01:02:31.770 に答える
0

最初のコメント: Ruby on Rails (またはその他の SQL 隠蔽フレームワーク) を使用する場合、基礎となる SQL クエリについて (あまり) 心配する必要はありません。それらは必要に応じて生成されます (「準最適」である可能性があります)。

あなたの質問に答えるには:「製品オブジェクトからベンダー情報を取得するにはどうすればよいですか」(または、少なくともそれが私の読み方です)

belongs_tohas_manyおよびその他の関連付けは、実装クラスに属性を追加します (この場合はおよびProductクラスVendor)。この属性を使用して、関連付けられたオブジェクトの情報を取得できます。

p = getSomeProduct(...)
v = p.vendor
vendorName = p.vendor.name # or use v.name of course

このコードはおそらく (ATM かどうかは確認できませんが) 複数の SQL クエリを生成して実行します。これは、SQL を開発者から隠すフレームワークを使用するために支払う代償です。

Ruby on Rails での関連付けの詳細については、Active Record Associationsのガイドをお読みください。

于 2012-11-13T01:07:26.637 に答える