2010-10-06 3 views
11

Ich habe ein Author Modell, das hattm: Feeds. Mit Rails 3 möchten Sie einen Bereich einrichten, in dem alle Autoren gefunden werden, denen keine Feeds zugeordnet sind.Wie wird der Rails 3-Bereich verwendet, um nach einer Tabelle zu filtern, in der die zugehörigen Datensätze nicht existieren?

class Author < ActiveRecord::Base 

    has_and_belongs_to_many :feeds 
    scope :without_feed, joins(:feeds).where("authors_feeds.feed_id is null") 

end 

... scheint nicht zu funktionieren. Es fühlt sich an wie eine einfache Sache. Was fehlt mir hier?

+0

Es fühlt sich an wie die Joins (: feeds) einen inneren Join durchführt, der nur einen Autor auswählt, wenn sie Feeds haben? – Midwire

+0

Es ist in der Tat eine innere Join: 'SELECT Autoren. * FROM Autoren INNER JOIN Autoren_Feeds ON Autoren_Feeds.Autor_ID = Autoren.ID INNER JOIN Feeds ON feeds.id = authors_feeds.feed_id WHERE (authors_feeds.feed_id ist null)' und was ich want ist eine äußere Verbindung. Irgendeine Hilfe? – Midwire

Antwort

21

Nach meinem Wissen haben ActiveRecord/Arel keine Möglichkeit, äußere Joins zu definieren. Sie müssen also ein bisschen mehr SQL schreiben als normal. So etwas sollte den Trick machen:

scope :without_feed, joins('left outer join authors_feeds on authors.id=authors_feeds.author_id').where('authors_feeds.feed_id is null') 

Ich rate natürlich bei Ihren Tabellennamen und Fremdschlüsseln. Aber das sollte dir das Bild geben.

+0

Ja, das war es. Vielen Dank! – Midwire

+1

Um das Umgekehrte zu tun (nur Autoren zurückgeben, die X haben), aber mit einem einfachen Autor has_many Adressen, diese verrückte Sache (aus diesem Beitrag und [dieser Blog-Kommentar] zusammengestückelt (http://www.bennadel.com/) blog/1093-Getting-One-Record-Pro-Group-Von-Ein-zu-Vielen-Join.htm # comments)) scheint zu funktionieren: 'scope: with_address, joins (" linker äußerer Join (select author_id from Adressen nach author_id) als Adressen auf addresss.author_id = authors.id "). where (" addresss.author_id ist nicht null ")' – chadoh

+0

@bioneuralnet, vielen Dank –

Verwandte Themen