0

我在使用 include 语句时遇到了麻烦。

我的搜索模型如下所示:

users = User.includes(:profile)
users = users.active
users = users.where('users.age = ?', value)
users = users.where('profiles.abc = ?',value2)

我的用户模型:

scope :active, where('users.has_photo = ?', true)

这是怎么回事。当我没有进入搜索模型'users = users.active'时 - 一切正常。进行左外连接。为什么这个“额外”语句会破坏左外连接?我是 Rails 和 sql 的新手,也许这很简单。

当我还没有用户 = users.active - 查询是这样的

SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "profiles" ON "profiles"."user_id" = "users"."id" WHERE (profiles.age >= '15') AND (profiles.age <= '75') AND (profiles.gender IN(1,2)) - this is query when everything works.

和用户 = users.active

SQLite3::SQLException: no such column: profiles.age: SELECT COUNT(*) FROM "users"  WHERE (users.has_photo = 't') AND (profiles.age >= '21') AND (profiles.age <= '35') AND (profiles.gender IN(1,2))

has_photo 只是我在用户添加照片时调用的一种方法:

def set_active(value)

    self.has_photo = value

  end
4

1 回答 1

0

我不明白你为什么要在新行中添加每个语句而不是像这样链接:

users = User.includes(:profile).active.where('users.age = ? AND profiles.abc = ?', value, value2)

应该可以正常工作

编辑:鉴于您的评论,我认为您应该将范围更改为 Proc

scope :active, Proc.new { where(:has_photo => true) }

我不确定原因,但由于 Rails 4 所有范围都必须是 Procs,所以必须有一个!

编辑: stevanity 对这个话题更了解

那么需要 procs 或 lambdas 或简单块 {} 的原因是为了避免对查询的急切评估。首次加载模型时,此类查询将被评估为 SQL。因此,如果您指定了一个实际动态的条件,例如 where(:created_at => Date.today),那么它将始终返回在特定应用程序启动之日创建的记录!为了避免所有这些,Rails4 要求作用域有一个可调用的 proc/function/block/lambda 作为参数,以便可以在需要时调用和评估它们。

于 2013-08-06T19:02:58.300 回答