6

Rails を使用するのはこれが初めてで、1 つの SQL クエリで has one ポリモーフィック アソシエーションをロードできるかどうか疑問に思っていました。モデルとそれらの間の関連付けは十分に基本的なものです。アセット モデル/テーブルは、ポリモーフィックな関連付けを通じてコン​​テンツ (画像、テキスト、またはオーディオのいずれか) を参照できます。

class Asset < ActiveRecord::Base
  :belongs_to :content, :polymorphic => true
終わり

Image、Text、Audio は次のように定義されます。

class Image < ActiveRecord::Base
  :has_one :asset, :as => :content
終わり

画像を読み込もうとすると、次のように言います。

Image.first(
      :条件 => {:id => id},
      :include => :asset
)

2 つのクエリを指定します。1 つはイメージを取得するためのもので、もう 1 つはアセットを取得するためのものです (参考までに、これは を指定した場合にも発生します:joins)。私の理解では、ActiveRecord がこれを行うのは、Image と Asset の間に 1 対 1 の関連付けがあることを認識していないためです。強制的に結合して 2 つのオブジェクトを一度に取得する方法はありますか? また、カスタム選択で結合を使用してみましたが、ActiveRecord モデルとその関連付けを手動で作成する必要があります。

ActiveRecord はこれを行う方法を提供していますか?

4

3 に答える 3

2

Railsソースを調べた後、select、conditions、またはorder句のいずれかで現在のモデル以外のテーブルを参照することで、強制的に結合できることを発見しました。

したがって、Assetテーブルで注文を指定すると、次のようになります。

Image.first(
      :conditions => {:id => id}、
      :include =>:asset、
      :order => "asset.id"
)。

結果のSQLは、左外部結合とすべてを1つのステートメントで使用します。私は内部結合を好んだでしょうが、これは今のところうまくいくと思います。

于 2009-09-25T08:30:50.020 に答える
1

(これはRails 3構文用です。)

MetaWhereは、ActiveRecordの通常のドメインの外にある複雑なクエリを簡単でルビーのようにするための素晴らしい宝石です。(@wayne:外部結合もサポートしています。)

https://github.com/ernie/meta_where

多態的な結合は少し注意が必要です。これが私がMetaWhereで私のやり方をした方法です:

Image.joins(:asset.type(AssetModel)).includes(:asset)

実際、私はポリモーフィック関連を持つクラスで便利なメソッドを作成しました。

  def self.join_to(type)
    joins(:asset.type(type)).includes(:asset)
  end

そのため、常に特定のタイプのアセットを照会して熱心にロードします。1つのクエリで複数のタイプの結合と混合しようとしたことはありません。ポリモーフィズムは同じ外部キーを使用して異なるテーブルを参照するため、SQLレベルでは、1つの結合は1つのテーブルにのみ結合するため、個別の結合として指定する必要があります。

ARELの驚くべきパワーにアクセスできるため、これはActiveRecord3でのみ機能します。

于 2011-04-13T21:07:20.883 に答える
1

私は自分でこの問題に遭遇しました。ActiveRecord は、最適化されたデータベース呼び出しよりも、Rubyist (SQL にあまり慣れていないかもしれません) がデータベースと簡単にやり取りできるようにすることに重点を置いています。パフォーマンスを向上させるために、より低いレベル (DBI など) でデータベースと対話する必要がある場合があります。ActiveRecord を使用すると、スキーマの設計方法に確実に影響します。

SQL の効率性に対する欲求から、他の ORM の使用を考えるようになりました。ニーズに合うものが見つかりませんでした。トランザクション SQL 自体 (Sequel など) に移行するものでさえ、重い Ruby API を持っています。Ruby のような API がなくても、T-SQL を手動で作成するだけで十分です。私が ORM で求めている本当の利点は、(1 つ以上のテーブルの) 結果セットをオブジェクトにマッピングする M です。

于 2009-10-04T14:24:19.677 に答える