Rails3 muestra el texto del enlace condicional

En mi proyecto, un usuario puede seguir algunos temas.

class User < ActiveRecord::Base
  has_many :topic_followings 
  has_many :topics, :through => :topic_followings, :include => [:questions]

Luego tengo una página donde estoy mostrando todos los temas. Ejemplo: Salud [Seguir], Ciencia [Seguir]

[Seguir] es un enlace a un controlador que seguirá o dejará de seguir el tema dependiendo de si el usuario está siguiendo el tema o no.

Cuando estoy mostrando todos los temas, quiero que el texto del enlace [Seguir] cambie dependiendo de si el usuario está siguiendo el tema o no.

Aquí está el código del enlace.

<%= link_to 'Follow',new_topic_following_path(:topic_id => topic.id) %> 

¿Hay alguna forma de hacer esto? La única forma en que puedo pensar es usar 1 consulta SQL para cada tema, pero esto no es muy eficiente. ¿Alguna práctica que sea mejor?

preguntado el 28 de agosto de 11 a las 03:08

1 Respuestas

Puede hacer una consulta para una matriz de todos los ID de tema que sigue el usuario. Entonces, en su vista, o en un método auxiliar, simplemente podría verificar si la matriz contiene topic.id.

# add this either into your controller, or separate the query into the model file as a separate method
f_topics = TopicFollowing.where(:user_id => current_user.id).select(:topic_id)
@followed_topics = f_topics.collect { |t| t = t.topic_id }

<% @topics.each do |topic| %>
  <% if @followed_topics.include?(topic.id) %>
    # unfollow link here
  <% else %>
    follow link here
  <% end %>
<% end %>

El código no está probado, pero creo que debería funcionar aproximadamente. Asegúrese de cambiar las referencias de usuario y las columnas según sea necesario.

Respondido 28 ago 11, 07:08

En lugar de la consulta, escriba @user.topic_followings or @user.topics (o current_user.topics). No es necesario escribir una consulta explícita cuando tiene el objeto de usuario con la relación declarada. - nathanvda

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.