2017-06-19 2 views
0

Ich bin neu auf Schienen und stecken zwischen eager-loading von den letzten 2 Tagen. Ich habe zwei Modelle Car und Images mit Car has_many :images Assoziation. und ich habe eine API gemacht, die eine Reihe von Autos mit ihren Bildern zurückgibt. Ich möchte stattdessen alle Einzelbilder aus Assoziation. Ich bin mit wie:Get single record von has_many mit eager-loading in include

Car.where(:company=>"BMW").as_json(:include=> {:images}) 

Dadurch kehren alle Autos mit ihren alle Bilder. Ich möchte alle Autos mit ihrem einzigen Bild anstatt aller Bilder Array.

+0

ein anderen Verein hinzufügen in 'Car' Modell:' has_one: image' dann können Sie tun: 'Car.where (: Firma => "BMW"). as_json (: include => {: image}) ' – Surya

+0

@Nitisha - welches Bild willst du: das erste? – BKSpurgeon

+0

Fügen Sie möglicherweise ein Flag zu den "Bildern" hinzu, die ein primäres Bild definieren, und legen Sie dieses durch Validierung auf eins fest. – engineersmnky

Antwort

2

Sie has_one :image, -> { order(updated_at: :desc) } zu Car Modell hinzufügen sollte. Dies wird eine für die Assoziation definieren.

Dann könnten Sie alle Autos mit nur einem letzten aktualisiertes Bild pro Auto:

Car.where(company: 'BMW').as_json(include: [:image])

+1

Ich denke nicht, dass "default_scope" im Allgemeinen eine gute Idee ist. [Erste] (http://www.ombulabs.com/blog/ruby/rails/best-practices/why-using-default-scope-is-a-bad-idea.html) und [zweite] (https://rails-bestpractices.com/posts/2013/06/15/default_scope-is-evil/) Link zu erklären, warum –

+0

@MartinZinovsky Sie dies durcheinander gebracht. Ihre Links sprechen über 'default_scope' für das gesamte Modell. Mein Ansatz, es nur zur Assoziation hinzuzufügen. – DjezzzL

+0

ist es gut, zwei verschiedene Beziehungen für ein Bild wie has_many: images und has_many: image zu definieren? – Nitisha

0

Es hängt davon ab, was Sie brauchen.

  1. Wenn Sie zuerst benötigen, schreiben Sie bitte: Car.where(company: "BMW").first
  2. Wenn Sie zuletzt benötigen, schreiben Sie bitte: Car.where(company: "BMW").last

Ist es für Sie genug?

Wenn Sie has_many Zuordnung haben, müssen Sie wählen, welche Datensätze Sie benötigen (vielleicht fügen Sie einige Flag). Ohne diese Option haben Sie eine Sammlung von allen Assoziationsobjekten.

One mehr ist besser zu nutzen where(company: "BMW") als where(:company => "BMW")

+0

hast du mein Problem gelesen? Ich denke nicht, dass deine Antwort, dies ist kein guter Trick, um etwas zu schreiben, um upvotes zu erhöhen. Sinnvolle Antworten werden automatisch von Benutzern hochgeladen. – Nitisha

Verwandte Themen