2017-05-10 15 views
2

私はRubyをとても新しくしており、これを行うことはできません。私は2つのテーブルに基づいて選択を作成する必要があります:AとBはどちらもActiveRecordです。他のテーブルに基づいてレコードを取得する

class A < ActiveRecord::Base 
    belongs_to :b 
end 

class B < ActiveRecord::Base 
    has_one :a 
end 

関連していないBレコードをAレコードがあります。私はこの問題を持つレコードを取得したいと思います。

A.joins(:B) 

あなた場合:

答えて

2

Railsでは、belongs_toの関連付けは、テーブルab_idというフィールドがあることを意味します。これは、AテーブルがBへのアソシエーションへの直接アクセス権を持っていることを意味します。 coorasseが述べたように、あなたもちょうどRailsが解釈するA.where(b: nil)を、実行することができます。

が、これは B

編集せずにすべてのAレコードの配列を返します、接続された任意のBなしAレコードを取得A.where(b_id: nil)を実行するにはA.where(b_id: nil)となります。

+0

Ajoins(:B)。 => nil)? – learner

+0

ジョインは、 'B'が関連付けられている2つの(レールが' INNER JOIN'を実行している) 'A'レコードをつかむので、' B'は決してゼロになりません。しかし、 'join 'は、' nil'を付けずに関連をつかむときに非常に便利です。 –

+0

あなたのアプローチを使用して、端末で実行中のクエリは数秒後に終了します。 – learner

2

Hhhmm..youのような、

unassociated_ids = A.pluck(:id) - B.pluck(:a_id).uniq 
A.where(id: unassociated_ids) 

あなたが関連付けられたBレコードでレコードを取得することができます

+1

これはデータベースへの3つの要求です。非常に非効率的です。 –

+0

私は知っているが、私はそれが古くなったデータを消去するために1回の操作であると仮定します。コードに含まれる必要があるなら、間違いなく推奨されます... @Andrey Deineko –

+0

1つが代わりに可能です。特に、それがはるかに容易/短く/明確になるとき。 –

3

...それがお役に立てば幸いです何かを行うことができますBとの関連がないすべてのAレコードが必要です。

A.where(B: nil) 
+0

右。私は特定のフィールド値のような別の制限があるのだろうかと思います。たとえば、b.user_name = "Bryan"とします。 – learner

+0

これをレールコンソールで実行すると、PG :: UndefinedColumn例外 – learner

+0

@learnerがスローされます。あなたは、クリス・ブリソンの答えを使用してください:「A.where(b_id:nil)」または「A.where(b:nil)」または私が示したもの: –

3

さらに別のオプションは、includesを使用することです:

A.includes(:b).where(bs: { id: nil }) 

これは、データベースへの単一のクエリを行います。

+0

bsとは何ですか?正直なところ、私はBのデータベーステーブルに – learner

+0

を知らない 'あなたは(':あなたのケースでB')関連名を入れ​​include'、句を使用すると、常に実際のデータベーステーブル名を置く場所にどのようにモデルが呼び出されても問題ありません。 –

+0

@learnerのその複数の名前@learner –

関連する問題