您好我正在尝试将方法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
感谢您查看我的问题并度过了愉快的一天。
答案 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
您可以使用范围中的(用户{或任何名称)访问您从范围调用发送的参数
答案 1 :(得分:2)
正如Owen建议的那样,阅读the docs以了解范围是什么。它只是定义模型的类方法的另一种语法(就像你已经拥有的那样)。
scope :liked_by, ->(user) { joins(:likes).where(likes: { user_id: user.id }) }