如何将方法转换为范围。

时间:2016-08-02 04:30:25

标签: ruby-on-rails ruby

您好我正在尝试将方法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 个答案:

答案 0 :(得分:3)

@liked_bookmarks = Bookmark.liked_by(user)

在此行中,与将user parameter发送到method的方式相同,就像将其发送到scope一样。

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

您可以使用范围中的(用户{或任何名称)访问您从范围调用发送的参数

reference of scopes

答案 1 :(得分:2)

正如Owen建议的那样,阅读the docs以了解范围是什么。它只是定义模型的类方法的另一种语法(就像你已经拥有的那样)。

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