2016-11-12 7 views
0

Hier sind meine User und Beziehungen ModelleWie erstellt man einen Bereich für current_user.following?

class User < ActiveRecord::Base 
    has_many :active_relationships, class_name: "Relationship", 
           foreign_key: "follower_id", 
           dependent: :destroy 
    has_many :passive_relationships, class_name: "Relationship", 
           foreign_key: "followed_id", 
           dependent: :destroy 
    has_many :followers, through: passive_relationships, source: :follower 
    has_many :following, through: :active_relationships, source: :followed 

class Relationship < ActiveRecord::Base 
    belongs_to :follower, class_name: "User", counter_cache: :followeds_count 
    belongs_to :followed, class_name: "User", counter_cache: :followers_count 
    validates :follower_id, presence: true 
    validates :followed_id, presence: true 
    validates :followed, uniqueness: { scope: [:follower, :followed] } 
end 

In Benutzer-Controller ich tun kann:

@users = current_user.following 

Allerdings würde Ich mag in meinem User-Modell in einen Rahmen drehen.

Antwort

1

Es gibt zwei Dinge, die Sie nähern können:

  1. Finden Sie alle Benutzer, die jemandem folgen

    class User < ActiveRecord::Base 
        scope :following_to, -> (user_id) { 
        where(
         "id IN (SELECT followed_id 
           FROM relationships 
           WHERE follower_id = ? 
          )", 
         user_id 
        ) 
        } 
    end 
    
  2. alle Benutzer finden, die jemand folgen, das heißt, sie

    class User < ActiveRecord::Base 
        scope :follower, -> { 
        where("id IN (SELECT followed_id FROM relationships)") 
        } 
    end 
    

Schließlich ein Anhänger sind, können Sie diese Rahmen als Ihre Erwartung verwenden:

# Find all users who are following to User (id = 1) 
User.following_to(1) 

# Find all users who are following someone, 
# aka they are a follower 
User.follower 
1

durch die Instanz-Methode verwenden, können Sie eine Methode für Benutzermodell

wie diese machen:

class User < ActiveRecord::Base 

    def following? 
    self.following.present? 
    end 

end 

von Scope Verwenden Sie nur die Active Abfrage in den Anwendungsbereich des Modells aufrufen können.

1

Sie sollten erhalten auch auf diese Weise

scope :following?, lambda { |user| 
    { user.following.present? } 

Und das sollte wie in Ihrem Controller nennen werden

User.following?(current_user) 
Verwandte Themen