如何从作用域中的另一个模型返回对象?

时间:2014-09-17 23:26:06

标签: ruby-on-rails ruby-on-rails-4

我有一个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 }

但这给了我各种各样的错误。

2 个答案:

答案 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 }