2017-04-06 5 views
0

Ich habe eine Abfrage in Rails, die eine Reihe von Datensätzen basierend auf einer Reihe von OR-Anweisungen erhält.ActiveRecord Auftrag nach Anzahl der übereinstimmenden Bedingungen

@properties = policy_scope(Property).withdrawn_query(@hotlist_preference.withdrawn?) 
       .or(policy_scope(Property).fallen_through_query(@hotlist_preference.fallen_through?)) 
       .or(policy_scope(Property).time_on_market_query(@hotlist_preference.time_on_market?)) 
       .includes(:listings).paginate(page: params[:page], per_page: 20) 

Grundsätzlich gibt es 3 Abfragen Eine einfachere Version könnte wie folgt aussehen:

@properties = Property.where(state = withdrawn).or(where(state = fallen_through)).or(where(age = 4.weeks.ago)) 

Was ich will ist, um diese Abfrage durch die Anzahl der OR-Bedingungen jedes Ergebnis erfüllt tun. Also sagen, es gab eine Eigenschaft mit zurückgezogenem Status und ihr Alter ist vor 2 Wochen, es würde einen Bestellwert von 2 haben. Wenn es mir möglich wäre, würde ich auch den Bestellwert zu dem zurückgegebenen Hash der Eigenschaften hinzufügen, damit ich ihn verwenden kann es in der Aussicht.

Ich habe gekämpft, um eine saubere Möglichkeit zu finden, dies zu tun, ohne die Ergebnisse durch eine identische Reihe von Abfragen erneut auszuführen.

+0

Welche Datenbank zu erreichen, verwenden Sie? –

+0

Ich weiß nicht, ob dies von ActiveRecord unterstützt wird, aber * könnte * in Erwägung ziehen, auf [raw SQL] (http://StackOverflow.com/a/3289152/1954610) herunterzufallen, um dies zu erreichen? –

+0

Ich benutze PostgreSQL – rmaspero

Antwort

0

das sieht sehr schmutzig, aber nur so diese

@properties = Property.where(state = withdrawn).or(where(state = fallen_through)).or(where(age = 4.weeks.ago)).order('case when properties.state = 'withdrawn' && properties.state = 'fallen_through' && properties.age = 'your date' then 10 when hen properties.state = 'withdrawn' && properties.state = 'fallen_through' then 9 when properties.state = 'fallen_through' && properties.age = 'your date' then 9 when properties.state = 'withdrawn' && properties.age = 'your date' then 9 when properties.state = 'withdrawn' && properties.state = 'fallen_through' && properties.age = 'your date' then 10 when properties.state = 'withdrawn' then 8 when properties.state = 'fallen_through' then 8 when properties.age = 'your date' then 8 else 0 end) 
+0

Ich nahm Ihre Auftragsbestätigung ein wenig weiter und aufgeräumt. Wie ich denke, ich könnte es so tun, dass: (CASE WHEN condition1 DANN 1 ELSE 0 END + CASE WANN condition2 DANN 1 ELSE 0 END + CASE WANN condition3 DANN 1 ELSE 0 END) – rmaspero

+0

yeah, das ist viel sauberer. – user3775217

Verwandte Themen