2016-03-29 7 views
0

Ich versuche, alle Datensätze einer bestimmten Tabelle mit ihren zugeordneten Daten zu erhalten, wenn sie aus dem Modell aufgerufen werden. Ich habe verschiedene Optionen ausprobiert, aber ich kann es nicht herausfinden.Schienen enthalten alle zugehörigen Daten in Get alle Anfrage

Ich habe aa Schienen Struktur wobei: (nehmen alle Klassen erben von Active: base)

class Post 
    has_many :image 
    has many :comment 
end 

class Image 
    belongs_to :post 
end 

class Comment 
    belongs_to :post 
end 

Grundsätzlich möchte ich mit allen zugehörigen Daten in meinem Beitrag Klasse (oder Modell), um alle Beiträge bekommen . Zum Beispiel:

Post.all (but then here do something to include each post's images and comments) 

Ich habe diese beiden Optionen ausprobiert, aber sie haben nicht die zugehörigen Daten

Post.all.eager_load(:image, :comment) 
Blog2.all.includes(:image, :comment) 

In meinem Controller kehre ich ein Index-Methode

def index 
    @posts = Post.all 
    render json: @posts, :include => [:image, :comment] 
    end 

dieser Index Methode funktioniert haben perfekt und enthält die zugehörigen Daten mit jedem Datensatz, aber wenn ich versuche, alle Beiträge mit ihren zugehörigen Daten im Modell zu bekommen, kann ich nicht zur Arbeit kommen. Danke für die Hilfe

+0

Haben Sie versucht, 'Post.joins ([: Bild,: Kommentar]). All'? Sie können '' Post.joins ([: image,: comment]). To_sql' in 'rails console' ausführen und sehen, was' sql' generiert wird. – Dharam

+1

Und Sie müssen 'render json: @ posts.to_json (: include => [: image,: comment])' 'verwenden, um die Assoziationen nach json zu exportieren. – Dharam

Antwort

1

Sie sind in der Nähe. Die Methode includes lädt die zugehörigen Daten vorab, stellt sie Ihnen jedoch mit den Ergebnissen nicht zur Verfügung, es sei denn, Sie teilen dies ausdrücklich mit.

Zum Beispiel:

blog_records = Blog2.all.includes(:image, :comment) 
blog_records_with_associations = blog_records.map do |record| 
    record.attributes.merge(
    'image' => record.image, 
    'comment' => record.comment 
) 
end 

Dadurch werden die Daten in ein Array von Hashes, geeignet für die Veröffentlichung als json konvertieren.

Wenn Sie nur die zugehörigen Datensätze in Ruby zugreifen müssen, ist es einfacher:

blog_records = Blog2.all.include(:image, :comment) 
first_image = blog_records.image  # preloaded, no SQL fired 
first_comment = blog_records.comment # preloaded, no SQL fired 
+0

Nur um darauf hinzuweisen, ist die Antwort nur auf diesen speziellen Fall anwendbar, bei dem die Antwort direkt vom Controller als json gerendert wird. – mmhan

+0

@mmhan ok bearbeitet es. alles andere, was du hinzufügen würdest? –

Verwandte Themen