我在包含声明方面遇到了麻烦。
我的搜索模型如下所示:
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 soo的新手,也许这很简单。
当我没有users = 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 = 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
答案 0 :(得分: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所以必须有一个!
编辑:关于这一主题的更多知识
需要procs或lambdas或简单块{}的原因是 避免急切评估查询。评估此类查询 在第一次加载模型时进入SQL。所以,如果你有 指定一个实际上是动态的条件,如where(:created_at =&GT; Date.today),然后它将始终返回特定应用程序启动当天创建的记录!避免所有这些Rails4 要求范围具有可调用的proc / function / block / lambda as 参数,以便在需要时调用和评估它们。