2016-08-02 111 views
0

你好,我試圖將方法self.liked_by(user)轉換成一個範圍。我不完全確定我的導師要求什麼,所以對這個問題的任何解釋都非常感激。如何將方法轉換爲範圍。

這是有問題的方法,我應該把它變成一個範圍。

def self.liked_by(user) 
    joins(:likes).where(likes: { user_id: user.id }) 
end 

這是那裏的方法出現在模型中

class Bookmark < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :topic 
    has_many :likes, dependent: :destroy 
    before_validation :httpset 
    validates :url, format: { with: /\Ahttp:\/\/.*(com|org|net|gov)/i, 
    message: "only allows valid URLs." } 

    def self.liked_by(user) 
    joins(:likes).where(likes: { user_id: user.id }) 
    end 

    def httpset 
    if self.url =~ /\Ahttp:\/\/|\Ahttps:\/\//i 
    else 
     if self.url.present? 
     self.url = "http://"+ self.url 
     else 
     self.url = nil 
     end 
    end 
    end 
end 

而這正是該方法在控制器稱爲

class UsersController < ApplicationController 
    def show 
    user = User.find(params[:id]) 
    @bookmarks = user.bookmarks 
    @liked_bookmarks = Bookmark.liked_by(user) 
    end 
end 

感謝您看我的問題,有一個美好的一天。

+2

使用(用戶{或任何名稱)來訪問沒有直接給出答案了......請參閱http ://guides.rubyonrails.org/active_record_querying.html#scopes – Owen

+1

以下是關於使用範圍與類方法之間的細微區別的較早但很棒的文章:http://blog.plataformatec.com.br/2013/ 02 /有源記錄範圍-VS-類方法/ – trueunlessfalse

回答

3

@liked_bookmarks = Bookmark.liked_by(user)

在這條線,以同樣的方式您發送user parametermethod,以同樣的方式,你可以把它送到一個scope

class Bookmark < ActiveRecord::Base 
    --------- 
    --------- 
    scope :liked_by, ->(user) { joins(:likes).where(likes: { user_id: user.id }) } 
    --------- 
    --------- 
    end 

你從範圍調用發送的參數可在範圍

reference of scopes

2

正如歐文建議,閱讀the docs瞭解什麼範圍。這只是另一種定義模型類方法的語法(就像你已經擁有的類)。

scope :liked_by, ->(user) { joins(:likes).where(likes: { user_id: user.id }) }