2010-10-06 10 views
11

Ho un modello Author che habtm: feeds. Utilizzando Rails 3 si desidera impostare un ambito che trovi tutti gli autori che non hanno feed associati.Come utilizzare lo scope Rails 3 per filtrare sulla tabella di join habtm in cui i record associati non esistono?

class Author < ActiveRecord::Base 

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

end 

... non sembra funzionare. Sembra una cosa semplice. Cosa mi manca qui?

+0

Sembra che i join (: feed) stiano eseguendo un join interno che selezionerà solo un autore se hanno feed in primo luogo? – Midwire

+0

Effettua effettivamente un join interno: 'SELEZIONA autori. * Dagli autori INNER JOIN autori_feeds ON authors_feeds.author_id = authors.id feed ENNER INTERNA SU feeds.id = authors_feeds.feed_id WHERE (authors_feeds.feed_id è null)' e cosa I voglio è un join esterno. Qualsiasi aiuto? – Midwire

risposta

21

A mia conoscenza ActiveRecord/Arel non ha un mezzo per definire i join esterni. Quindi dovrai scrivere un po 'più SQL del normale. Qualcosa del genere dovrebbe fare il trucco:

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

Sto ovviamente indovinando i nomi dei tavoli e le chiavi esterne. Ma quello dovrebbe darti l'immagine.

+0

Sì, è così. Grazie! – Midwire

+1

Per fare l'inverso di questo (restituisce solo Autori che hanno X) ma con un semplice autore ha_many Indirizzi, questa cosa pazzesca (messa insieme da questo post e [questo commento del blog] (http://www.bennadel.com/ blog/1093-Getting-One-Record-Per-gruppo-Da-uno-a-molti-Join.htm # commenti)) sembra funzionare: 'scope: with_address, joins (" left outer join (seleziona author_id da indirizzi group by author_id) come indirizzi su addresses.author_id = authors.id "). where (" address.author_id non è null ")' – chadoh

+0

@bioneuralnet, molte grazie –

Problemi correlati