0

次のクエリを使用して、レールからpostgres dbをクエリしようとしています

    def is_manager(team)
    User.where("manager <> 0 AND team_id == :team_id", {:team_id => team.id})
  end

これは基本的に、マネージャーにフラグが立てられていることと、その team.id が関数に渡された現在の ID であることを確認しています。

私のビューには次のコードがあります

 %td= is_manager(team)

エラーまたは返されるものは

#<ActiveRecord::Relation:0xa3ae51c>

私が間違っていた場所についての助けは素晴らしいでしょう

4

2 に答える 2

1

ActiveRecord へのクエリは常に ActiveRecord::Relations を返します。そうすることで、基本的にクエリの遅延読み込みが可能になります。これがクールな理由を理解するには、次のことを考慮してください。

User.where(manager: 0).where(team_id: team_id).first

この場合、マネージャーではないすべてのユーザーを取得し、チーム ID が team_id のチームに属しているマネージャー以外のすべてのユーザーを取得してから、最初のユーザーを選択します。このコードを実行すると、次のようなクエリが得られます。

SELECT * FROM users WHERE manager = 0 AND team_id = X LIMIT 1

ご覧のとおり、コード内で複数のクエリが作成されていましたが、ActiveRecord はそれらすべてを 1 つのクエリにまとめることができました。これはリレーションを通じて行われます。実際のオブジェクトが必要になると (つまり、最初に呼び出したとき)、ActiveRecord は DB にアクセスしてレコードを取得します。これにより、不要なクエリが防止されます。ActiveRecord は、クエリされたオブジェクトの代わりに関係を返すため、これを行うことができます。Relation クラスを考える最良の方法は、配列のすべてのメソッドを持つ ActiveRecord のインスタンスであるということです。リレーションに対してクエリを呼び出すことができますが、リレーションを反復することもできます。

それが明確でない場合は申し訳ありません。

ああ、あなたの問題を解決するために。%td = is_manager(team).to_aこれにより、Relation オブジェクトがユーザーの配列に変換されます。

于 2012-08-03T14:52:39.797 に答える
0

.first を使用して最初のレコードを取得するだけで、これが役立つ場合があります。 User.where("マネージャー <> 0 AND team_id == :team_id", {:team_id => team.id}).first

于 2012-08-03T14:33:16.747 に答える