0

mes modèleshas_many> à travers?

class House 
has_many :taggings 
has_many :tags, through: :taggings 
end 


class Tag 
has_many :taggings 
has_many :houses, through: :taggings 
end 

Routes:

scope "/:locale" do 
resources :houses do 
    collection do 
    get 'tags/:tag', to: 'houses#index', as: :tag 
end 
contrôleur Maison

:

if params[:tag] 
     @houses = House.tagged_with(params[:tag]) 
     @tag = Tag.find_by_name(params[:tag]) 
    else 

vue index Maison

- @houses.each do |house| 
= raw house.tags.map(&:name).map { |t| link_to t, tag_houses_path(t), class: active_class?(tag_houses_path(t)) }.join 

Je veux montrer les tags avec l encres aux pages marquées. Cela fonctionne bien, mais lorsque 2 maisons sont marquées avec la même balise (1 dans la base de données), la vue affiche 2 mêmes balises. (Par exemple les maisons 1 et 2 sont marquées avec "famille" je vois 2 étiquettes de famille sur la page d'index) Comment puis-je résoudre ce problème?

Thanks..remco

Répondre

0

Vous voulez l'ensemble des balises qui sont attachés à au moins une maison, non?

Tag.joins(:taggings).select(“distinct(tags.id)”) 
+0

lorsque 1 maison a une relation à tag "famille" la balise est montrée 1 fois, quand 2 maisons différentes sont tag avec la famille> 2 balises familie sont montrées - quand 3 maisons différentes sont tag avec la famille> 3 balises familie sont montrées. Donc dans mon cas 5 maisons sont marquées avec "famille", 5 étiquettes avec le nom "famille est montrée, au lieu d'une étiquette de famille. – Remco

0

Je ne sais pas ce que vous voulez que votre vue de ressembler exactement, mais la déclaration suivante vous donnera l'ensemble unique de balises associés à toutes les maisons dans la vue/tableau:

@houses.collect {|h| h.tags.collect {|x| x.name}}.flatten.uniq