2010-09-05 7 views
9

Wir planen, unsere Anwendung auf Rails3 zu aktualisieren. Ein Plugin, das wir ziemlich oft benutzt haben, ist nested_has_many_through. Dieses Plugin scheint veraltet zu sein und wird nicht länger gewartet. Es scheint einfach nicht in einer neuen Rails3-Anwendung zu funktionieren.Rails3 verschachtelt has_many durch Frage

Ein einfaches Beispiel:

Author.rb 
has_many :posts 
has_many :categories, :through => :posts, :uniq => true 
has_many :related_posts, :through => :categories 

Post.rb 
belongs_to :author 
belongs_to :category 

Category.rb 
has_many :posts 

Kann jemand die beste Praxis Art und Weise empfehlen diese oder eine Arbeits Rails3 Plugin zu behandeln?

Danke !!

+1

Haha Ich habe gerade Ihre Gabel http://github.com/releod/nested_has_many_thr gefunden ugh und erinnerte sich an diese Frage und kam hierher, um Ihnen alles über die Gabel zu erzählen. Und dann habe ich deinen Benutzernamen gesehen. Gute Arbeit, ich habe das gerade auf meiner Rails 3 App getestet und es funktioniert (meistens). Ich habe die ganze Nacht versucht, Rails direkt nach https://rails.lighthouseapp.com/projects/8994/tickets/1152-support-for-nested-has_many-through-associations zu patchern, aber steckend. Ich fange mit deiner Gabel als Vorlage an und komme jetzt vielleicht weiter! –

+0

+1 http://github.com/releod/nested_has_many_durch deine rails3 fork funktioniert auch für mich, werde es bis rails verwenden 3.1 – clyfe

Antwort

0

Ich bin mehr verwirrt durch die has_many: related_posts Teil. Versuchen Sie, kategorisierte Beiträge im Wesentlichen zu verbinden? Wie werden alle Beiträge in der Kategorie "x" als "verwandt" betrachtet? Wenn ja, wird dies nicht da basierte Arbeit auf keine RelatedPost Klasse zu sein, so dass dies zu beheben, auf ein absolutes Minimum, dann würden Sie angeben müssen: class_name über die Assoziation:

has_many :related_posts, :class_name => 'Post', :through => :categories 

Aber zweitens, es ist wahrscheinlich nicht die richtige Herangehensweise. Da jeder Autor bereits über den Fremdschlüssel autor_id viele Einträge hat, ist es sinnlos, durch die Kategorien-Tabelle zu weben, stattdessen Gruppierungslogik zu verwenden.

Alternative Ansätze, die diese aufzuräumen:

Author.rb

has_many :posts do 
    def related 
    all.group_by(&:category_id) 
    end 
end 
author.posts.related 
=> OrderedHash 

Natürlich ist all dies strittig, ob es nicht war, was Sie erreichen wollten. : P

+2

Ich bin geneigt zu denken, dass sein Beispiel erfunden ist (daher leicht fehlerhaft). Seine Frage ist immer noch fundamental wichtig. Und nach meinem besten Wissen gibt es keine funktionierende Lösung für verschachtelt hat viele Durchgänge in Rails 3 (a la die alte Nested_has_many_through für Rails <2.3) –

+0

Der letzte Teil seiner Frage erwähnt "Empfehlung der Best Practice". Mein Punkt war, wenn Ihre App es erfordert, gibt es wahrscheinlich einen besseren Mechanismus, um es zu erreichen. ;) Wenn sein Beispiel wirklich erfunden ist, wäre es unglaublich hilfreich, seinen tatsächlichen Code zu sehen. – jenjenut233

+1

Fair genug. Es gibt definitiv Anwendungsfälle, bei denen ein Nested viele Assoziationen hat (d. H. Mehrere INNER JOINs für die Nicht-Rails-Leute verwenden) ist eine gültige Lösung und oft die beste Lösung. Gegeben "Author - - Abonnenten> -

0

Rails 3 (ungetestet, Aufträge durch Beiträge mit den meisten verwandten Kategorien zuerst):

category.rb:

class Category < ActiveRecord::Base 
    class << self 
    def posts 
     Post.joins(:categories). 
      where(:categories => select('id').all.map(&:id)). 
      group('posts.id'). 
      order('count(*) DESC') 
    end 
    end 
end 

Verbrauch:

related_posts = author.categories.posts