2016-10-09 21 views
1

Rails Frage ...Rails ActiveRecord gibt keine Werte zurück

Ich versuche, Daten aus einigen Tabellen, die in meiner Datenbank in einer Ansicht zusammengefügt sind, auszudrucken. Insbesondere möchte ich jede Eigenschaft Adresse auszudrucken („Adresse“ von Property-Modell) und es ist entsprechend Kommentar („comment_text“ von Interesse Model)

Fragen:

1) Im Moment bin Beitritt ich die Tabellen in die Aussicht; Ich nehme jedoch an, dass dies nicht korrekt ist, aber ich bin mir unsicher, wie ich sie in den Controller einbinden kann. Sollte ich mich überhaupt den Tischen in der Ansicht anschließen? Oder sollte das im Controller passieren?

2) In meiner Ansicht möchte ich die Adresse und den entsprechenden Kommentartext ausdrucken; wenn ich jedoch versuche, jetzt auszudrucken, sieht es wie ein aktives Aufzeichnungsbeziehungsobjekt aus, d. h. zeigt "[" test "]" und ich möchte "test" anzeigen

Irgendwelche Ideen? Code unten:


Schema:

create_table "interests", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "property_id" 
    t.string "interested", default: "unknown" 
    t.string "comment_text" 
    t.datetime "created_at",      null: false 
    t.datetime "updated_at",      null: false 
end 

add_index "interests", ["property_id"], name: "index_interests_on_property_id" 
add_index "interests", ["user_id"], name: "index_interests_on_user_id" 

create_table "properties", force: :cascade do |t| 
    t.string "address" 
    t.string "city" 
    t.string "state" 
    t.integer "zip" 
    t.datetime "created_at",        null: false 
    t.datetime "updated_at",        null: false 
end 

Modelle:

class Property < ActiveRecord::Base 
    has_many :interests 
    has_many :users, through: :interests 

    default_scope {order("id ASC")} 
end 

class Interest < ActiveRecord::Base 
    belongs_to :property 
    belongs_to :user 

    validates :user_id, :presence => true 
    validates :property_id, :presence => true 
end 

Controller:

def index 
    @properties = Property.all 
end 

Ausblick:

<% @properties.each do |p| %> 
    <td><%= p.interests.collect(&:comment_text) %> 
<% end %> 

Antwort

1

1) Im Moment schließe ich mich den Tabellen in der Ansicht an; Ich nehme jedoch an, dass dies nicht korrekt ist, aber ich bin mir unsicher, wie ich sie in den Controller einbinden kann. Sollte ich mich überhaupt den Tischen in der Ansicht anschließen? Oder sollte das im Controller passieren?

Die Antwort basiert auf Meinungen. Einige Leute bevorzugen DB-Abfragen innerhalb der Ansicht für verschiedene Resons. Beispielsweise können Ansichten zwischengespeichert werden und Sie fragen Ihre Datenbank nicht ab. Andere Leute sagen, dass es aus anderen Gründen, wie bessere Tests, nicht in die Ansicht gehört. Sie können also einen Pfad wählen oder ihm folgen.

2) d zeigt "[" Test "]", und ich will, es zeigen "test"

p.interests.collect(&:comment_text) ein Array zurückgibt. Erb ruft indirekt p.interests.collect(&:comment_text).to_s an, damit Sie bekommen, was Sie sehen.

Wenn Sie eine andere Ausgabe wünschen, müssen Sie über Ihre comment_texts iterieren.

<% @properties.each do |property| %> 
    property.interests.each do |interest| 
     <td><%=interest.comment_text %> 
    <% end %> 
<% end %> 
+0

Dank slowjack! Nicht sicher, wie ich das vermisst habe, aber das hat funktioniert! – Anthony

0

ich denke, es wäre toll, wenn Sie verwenden include.With enthält, Active Record stellt sicher, dass alle angegebenen Verbände geladen, um die geringstmögliche Anzahl von Abfragen.

ex- Controller:

def index 
@properties = Property.includes(:interests) 
end 

Ansicht:

<% @properties.each do |property| %> 
    property.interests.each do |interest| 
    <td><%=interest.comment_text %> 
<% end %> 
<% end %> 

Ref ActiveRecord QueryMethods

Verwandte Themen