Domanda

Sto cercando di avvolgere la mia testa intorno a questo problema. So di vista non dovrebbe avere più di tanto la logica in loro. Ho un app con utenti, post e commenti. Gli utenti hanno molti post e commenti.

class User < ActiveRecord::Base
has_many :posts
has_many :comments

Messaggi appartenere a utenti e avere molti commenti.

class Post < ActiveRecord::Base
has_many :comments
belongs_to :user

Commenti appartengono a utenti e post

class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user

Nel mio post view # show che mostrano i commenti sotto il post. Voglio mostrare il nome dell'utente che ha effettuato il commento. Al momento ho questo a mio avviso:

<% @post.comments.each do |comment| %>
  <p>
    <b>Commenter:</b>
    <%= link_to  User.find(comment.userid).login, User.find(comment.userid) %>
  </p>

  <p>
    <b>Comment:</b>
    <%= comment.body %>
  </p>
<% end %>

I dovrebbe probabilmente avere quella logica nel mio controller messaggi. Ma io sono abbastanza confuso. @ Post.comments restituisce un array (?) Di commenti appartenenti al palo. Ciò significa che non posso avere @commenter = @ post.comments.userid. Sono confuso dal problema in modo forse non ho spiegato bene.

È stato utile?

Soluzione

In effetti durante il ciclo di commenti, è possibile utilizzare comment.user per ottenere i dati dell'utente dal momento che avete dichiarato la relazione User has_many Comments.

Altri suggerimenti

Per essere più esplicito la prima risposta, è sufficiente fare questo:

<%= link_to comment.user, comment.user %>

Nel vostro modello User, l'override del metodo to_s come questo così comment.user restituisce la stringa che si desidera:

def to_s
  self.login
end

Quindi, utilizzare carico desiderosi di ottenere tutti i dati in una chiamata SQL, invece di interrogare il DB separatamente per ogni comment.user. Nel vostro modello Post:

class Post < ActiveRecord::Base
  has_many :comments, :include => :user

E nel controller del messaggio:

def show
  @post = Post.find(params[:id], :include => :comments)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top