Domanda

Sto cercando di creare un named_scope che utilizza un join, ma sebbene l'SQL generato appaia corretto, il risultato è immondizia. Ad esempio:

class Clip < ActiveRecord::Base      
  named_scope :visible, {
    :joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id", 
    :conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
  }

(Una clip appartiene a una serie, una serie appartiene a uno spettacolo, uno spettacolo può essere visibile o invisibile).

Clip.all fa:

SELECT * FROM `clips` 

Clip.visible.all fa:

SELECT * FROM `clips` INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id WHERE (shows.visible = 1 AND clips.owner_type = 'Series' ) 

Sembra a posto. Ma l'array risultante di modelli di Clip include una Clip con un ID che non è presente nel database: viene invece prelevato un ID show. Dove sto sbagliando?

È stato utile?

Soluzione

Il problema è che " SELECT * " - la query raccoglie tutte le colonne da clip, serie e spettacoli, in questo ordine. Ogni tabella ha una colonna ID e provoca conflitti tra le colonne indicate nei risultati. L'ultima colonna id ritirata (dagli spettacoli) ha la precedenza su quella desiderata. Dovresti usare un'opzione: select con: joins, come:

named_scope :visible, {
  :select => "episodes.*",
  :joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id", 
  :conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top