2016-09-02 4 views
0

Ich habe eine Rails-Anwendung, wo ich folgende Modelle haben -Wie ein Modell zur Abfrage basierend auf mehreren zugehörigen Modelle

City, Hotel, Restaurant, Park.

Verbände sind so -

class City < ActiveRecord::Base 

has_many :hotels 
has_many :restaurants 
has_many :parks 

end 

ich alle Städte finden wollen, dass mindestens ein Hotel oder Restaurant oder Park haben.

Wie schreibe ich eine einzelne Abfrage, um solche Städte zu holen?

+0

Sie müssen Ihre Modellbeziehungen in der Frage – RAJ

+0

Right erwähnen. Ich habe meine Frage bearbeitet – RamanSM

Antwort

0

Für Rails 5 können Sie unter

cities = City.includes(:hotels, :restaurants, :parks) 
cities = ((cities.where.not(hotels: {id: nil})).or(cities.where.not(restaurants: {id: nil})).or(cities.where.not(parks: {id: nil}))) 

von Schienen Für niedrigere Version verwenden wie, müssen Sie arel_table

0

Das Stadtmodell mit ähnlichen Sachen irgendwelche Informationen nicht verwenden. Sie müssen die Daten von Hotel/Park/etc auswählen.

Verwenden Sie AR includes, um alle Städte mit den angegebenen Beziehungen zu finden.

City.includes(:hotels, :restaurants, :parks)

0

Geeignetste Lösung counter cache

Dann verwenden kann, müssen Sie in der Lage sein, zu fragen, wie

City.where('hotels_count > 0 OR restaurants_count > 0 OR parks_count > 0')

P. S. Diese Abfrage kann auf viele Arten neu geschrieben werden, z. B. .or Methode verwenden. Vergessen Sie auch nicht, den Cache-Zähler zurückzusetzen, wenn Sie Daten in zugeordneten Tabellen haben.

Verwandte Themen