Come posso rimuovere questa logica dal mio punto di vista?
-
05-10-2019 - |
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.
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)