Rotaie named_scopes con join
-
03-07-2019 - |
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?
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' "
}
Altri suggerimenti