Frage

Ich frage mich, ob es einen Weg zu „find_by_sql“ innerhalb eines named_scope zu verwenden. Ich möchte Gewohnheit behandeln SQL als named_scope so kann ich es auf meine bestehenden named_scopes Kette. Es wäre auch für die Optimierung einer SQL-Schnipsel ich häufig benutze gut sein.

War es hilfreich?

Lösung

Während Sie jede SQL setzen können Sie in den Bedingungen eines benannten Umfang mögen, wenn Sie dann find_by_sql rufen dann die ‚Bereiche‘ auf Abwege geraten geworfen.

Gegeben:

class Item
  # Anything you can put in an sql WHERE you can put here
  named_scope :mine, :conditions=>'user_id = 12345 and IS_A_NINJA() = 1'
end

Das funktioniert (es klebt nur die SQL-Zeichenfolge in dort - wenn Sie mehr als eine haben sie mit UND verbunden werden)

Item.mine.find :all
=> SELECT * FROM items WHERE ('user_id' = 887 and IS_A_NINJA() = 1)

Dies ist jedoch nicht

Items.mine.find_by_sql 'select * from items limit 1'
=> select * from items limit 1

So die Antwort "Nein". Wenn Sie darüber nachdenken, was hinter den Kulissen geschehen muss dann macht dies sehr viel Sinn. Um die SQL-Schienen zu bauen muss wissen, wie sie paßt zusammen.
Wenn Sie normale Abfragen erstellen, die select, joins, conditions werden usw. alle in verschiedene Stücke zerbrochen. Rails weiß, dass es Dinge zu den Bedingungen hinzufügen können, ohne alles andere zu beeinflussen (was, wie with_scope und named_scope Arbeit).

Mit find_by_sql Sie jedoch nur geben Schienen einen großen String. Es weiß nicht, was geht, wo, so ist es nicht sicher für sie in zu gehen und die Dinge fügen Sie es in den Bereichen hinzufügen würde arbeiten müssen.

Andere Tipps

Dies bezieht sich nicht auf genau das, was Sie gefragt, aber Sie könnten ‚contruct_finder_sql‘ untersuchen. Damit können Sie die SQL eines benannten Umfang erhalten.

named_scope :mine, :conditions=>'user_id = 12345 and IS_A_NINJA() = 1'
named_scope :additional {
  :condtions => mine.send(:construct_finder_sql,{}) + " additional = 'foo'"
}

sicher, warum nicht

: named_scope: conditions => [SQL-]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top