2009-05-23 8 views
1

Erweiterung auf recent_posts_on_self unten, Ich möchte eine all_recent_posts_on_self Methode hinzufügen, aber ich bin mir nicht sicher, ob es möglich ist mit der Syntax self.posts.find. Auf der anderen Seite scheint all_recent_posts_on_class einfach zu sein.Ist es möglich, in self.posts.find über das Selbst hinauszuschauen?

Im obigen Beispiel habe ich zwei Möglichkeiten, um die letzten Blogposts zu finden, die einem Benutzer zugeordnet sind. Ich kann Post.find aufrufen und die author_id übergeben oder ich kann self.posts.find aufrufen und muss keine Autoren-ID übergeben. Ich nehme an, dies liegt daran, dass im zweiten Fall self.posts bereits auf Basis des Primärschlüssels des Benutzerobjekts und der mit diesem Benutzer verknüpften has_many: -Posts eingeschränkt wurde. Dies ist ein Vorteil in diesem Fall, da ich nicht die Mühe machen muss, author_id als Argument zu übergeben. Aber wenn ich die Abfrage nicht nach Autor einschränken müsste, wäre es möglich, einen all_recent_posts_on_self dafür zu erstellen?

Was ich rede ist ein Äquivalent dieser Methode (die die auslässt: Bedingungen):

def all_recent_posts_on_class 
    Post.find(:all, :order => 'created_at asc', :limit => 5) 
    end 

Aber mit self.posts.find statt Post.find:

def all_recent_posts_on_self 
    self.posts.find(...) 
    end 

auch:

auch wenn es möglich ist, self.po zu verwenden sts.find, um dies zu tun, ist es "besser", Post.find zu verwenden?

Antwort

4

Dies ist nicht genau das, was Sie gefragt haben, aber ich halte dies für hilfreich, um gängige Muster zu kennen und zu befolgen, um komplizierte oder verwirrende Implementierungen zu vermeiden.

Der „Rails Weg“, dies zu tun ist Scopes zu verwenden:

user.posts.recent # 5 most recent posts by the user 
Post.recent # 5 most recent posts globally 
+0

Das ist wirklich nett. Ich wusste nicht, dass du das kannst. Vielen Dank. –

1

Ich bin mir nicht sicher, warum Sie self.posts.find (..) verwenden sollten, um nach Beiträgen anderer Autoren zu suchen. Dieses Idiom dient speziell dem Zweck, eine Teilmenge der Objekte zu finden, die der bestimmten Instanz zugeordnet sind.

Post.find() sollte verwendet werden, wenn Sie keine Beschränkung auf ein bestimmtes Benutzermodell wünschen. Immerhin war die Methode posts() für das User-Objekt lediglich eine Annehmlichkeit, die im Grunde mit einem (im Cache gespeicherten) Aufruf von Post.find (: all,: conditions => ['author_id', self.id]) identisch ist.

+0

Ok, ich nehme:

class Post < ActiveRecord::Base belongs_to :user named_scope :recent, :order => 'created_at desc', :limit => 5 end class User < ActiveRecord::Base has_many :posts end 

Es ist nicht viel mehr deklarative und einfach als das lesen bekommt Ihre Logik, warum es sinnvoll ist, mit Post.find() nach Beiträgen anderer Autoren zu suchen. Aber ist es überhaupt möglich, nach Beiträgen anderer Autoren über self.posts.find() zu suchen? –

+1

Nicht möglich. Alles, was Sie tun, wird nur UND die Abfrage Segmente zusammen. Sie haben also "AND author_id = 5 AND author_id = 6". Das gibt Ihnen wahrscheinlich nichts, außer Sie verwenden einen RDMS, von dem ich noch nichts gehört habe. :) –

+0

So funktioniert das! –