2017-03-02 1 views
0

Der Code so geht:Sequel fügen Sie einen ‚Umfang‘ nach einer bedingten

class Foo < Sequel::Model 
    self.dataset_module do 
    def property_active 
     where('properties @> \'{"active": true}\'') 
    end 
    end 
end 

class Bar 
    def foo_ids 
    Foo.select(:other_model_id).distinct.all 
    end 

    def condition? 
    ... 
    end 
end 

ich die foo_ids Methode ändern möchten o der condition? Methode den Umfang property_active hinzufügen abhängig. Bisher komme ich mit auf den Punkt:

Foo.select(:other_model_id).where{ Foo.property_active if condition? }.distinct 

Und es gibt:

# when condition? is true 
=> "SELECT DISTINCT \"other_model_id\" FROM \"foos\" WHERE (SELECT * FROM \"foos\" WHERE (properties @> '{\"active\": true}'))" 

# when condition? is false 
=> "SELECT DISTINCT \"other_model_id\" FROM \"foos\"" 

Der Code ist gut, aber ich weiß nicht, wie die Idee, dass SELECT nach dem WHERE, gibt es eine Möglichkeit, eine nette Abfrage für den true Fall zurückzugeben? so etwas wie:

"SELECT DISTINCT \"other_model_id\" FROM \"foos\" WHERE (properties @> '{\"active\": true}')" 

Antwort

1

ich nicht allzu vertraut mit der Art und Weise Sequel bin Griffe Verkettungs und Bereiche, aber das ist, wie ich es mit der Art und Weise Active Griffe Dieser Ansatz würde. Funktioniert das?

class Bar 
    def foo_ids 
    scope = Foo.select(:other_model_id) 
    scope = scope.property_active if condition? 
    scope.distinct.all 
    end 
end 
+0

Dies funktioniert, hoffentlich gibt es einen Sequel Weg, es zu tun. – zetacu

+0

@zetacu Nicht sicher, was Sie suchen, das ist anders. Der Kompositionsstil, den ich verwendet habe, wird auch in der [Einführung in Sequel] (https://github.com/jeremyevans/sequel#an-introduction) verwendet. – coreyward

+0

Ich habe gesucht, ob es eine Art Sequel-Methode gibt, um Abfragen in eine zu verschachteln, wie 'Model.query.conditional_query.query' etwas wie' Foo.where (bar: 'somethig'). Some_conditional_restriction_sequel_method.where (foo: 'something ') .all' auf diese Weise kann ich es in eine funktionalere Programmierung hinzufügen, ich glaube, die einzige Möglichkeit, etwas wie das zu tun wird ein Oszilloskop hinzufügen, aber hüpfte, dass die Fortsetzung bereits das eingebaut hat. – zetacu

Verwandte Themen