我有一个Post
模型,其中包含以下列:
# == Schema Information
#
# Table name: posts
#
# id :integer not null, primary key
# title :string(255)
# photo :string(255)
# body :text
# created_at :datetime
# updated_at :datetime
# user_id :integer
# ancestry :string(255)
# file :string(255)
# status :integer default(0)
# slug :string(255)
# is_published :integer default(0)
# has_eyewitness :boolean default(FALSE)
和Post belongs_to :user
。
我想要做的是在scope :eyewitness
上创建Post
,只要has_eyewitness
为真,就会返回相关的user
记录。
我试过这样做:
scope :eyewitness, -> { where (has_eyewitness: :true).user }
但这给了我各种各样的错误。
答案 0 :(得分:1)
您不应该从作用域返回单个模型实例,这不是作用域的范围。范围应始终返回ActiveRecord::Relation
,以便可以链接其他查询方法和范围。详细了解Scopes。
由于范围实际上是类方法的语法糖,我建议你使用类方法代替:
def self.eyewitness
where(has_eyewitness: true).first.user
end
请注意,where
会返回一个关系,这就是我们在调用first
之前调用user
的原因。
编辑:正如下面的评论中所讨论的,OP实际上是在寻找实例方法,而不是范围或类方法。在eyewitness
模型中添加post
方法应解决此问题:
class Post < ActiveRecord::Base
...
def eyewitness
user if has_eyewitness?
end
...
end
答案 1 :(得分:0)
我认为它应该是:
scope :eyewitness, -> { where (has_eyewitness: true).user }
或类似的东西:
scope :eyewitness, -> { where (:has_eyewitness => true).user }