2008-10-03 13 views
20

Próbuję utworzyć named_scope, który używa sprzężenia, ale chociaż wygenerowany SQL wygląda prawidłowo, wynik jest śmieci. Na przykład:Rails named_scopes z łączeniami

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' " 
    } 

(klip jest własnością Series, seria należy do Pokazują, a Poproś mogą być widoczne lub niewidoczne).

Clip.all robi:

SELECT * FROM `clips` 

Clip.visible.all robi:

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') 

To wygląda w porządku. Ale wynikowa tablica modeli Klipów zawiera Klip z identyfikatorem, którego nie ma w bazie danych - zamiast tego podniósł identyfikator pokazu. Gdzie się mylę?

Odpowiedz

26

Problem polega na tym, że „SELECT *” - kwerenda pobiera wszystkie kolumny z klipów, serii, i pokazuje, w tej kolejności. Każda tabela ma kolumnę identyfikatora i powoduje konflikty między nazwanymi kolumnami w wynikach. Ostatnia kolumna identyfikatora wycofana (z pokazów) przesłania wybraną. Powinieneś używać opcji: select z: joinami, takimi jak:

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' " 
}