我最近不得不重新编写一个名为CtrlPanel的应用程序,我已经完成并运行良好。(感谢StackOverflow上的几个用户的帮助!)
我现在到了第二个应用程序,我必须重写称为排放网关。就像CtrlPanel这个WebApp有一个叫做squeel的宝石,它使用自己的Monkey Patched DSL语言进行DB查询,所以我必须在正常的Ruby on Rails/ActiveRecord查询中重写所有这些。
这个应用程序有更多的这些查询,他们更复杂,而不是只是几个字段映射到其他字段,他们正在使用模型名称和符号名称组合。我需要重写所有的,我有一个问题在第一个。
错误不是我所期望的?它并没有给我一个查询本身的错误它给了我一个错误,如果我理解正确的话,是什么在调用查询?下面是错误信息:
未定义方法' call' for #
根据Better Errors,它是projects_controller。正在调用的Rb:
class ProjectsController < ApplicationController
load_and_authorize_resource
def dashboard
@projects = current_user.authorized_projects.order("created_at desc")
end
在我开始进行故障排除兔子洞之前,我想确定的是,我想知道我的查询重写是否看起来不错,即使它没有给我语法错误,我确信它可能有其他错误,我仍然是相对较新的。
下面是使用那个该死的压缩语言的原始查询:
#Project.joins{vendor}.where{(projects.vendor_id.eq my{ vendor_id }) |
(vendors.parent_vendor_id.eq my{ vendor_id })}.uniq
这是我重写的查询:
Project.joins(vendor).where({projects.(:vendor_id) => my.(:vendor_id)})
OR
({vendors.(:parent_vendor_id) => my(:vendor_id)}).uniq
我想我会尽量保持它非常简单,只提供最低限度的。基于以上,我有查询的语法正确还是我得到这个错误?我不需要重写使用classname的ctrlpanel上的任何查询。如果它有助于了解这个应用程序是一个更老的应用程序,用Ruby 2.0和Rails 3.2编写的。这是一个皇家痛苦让它启动,并得到登录提示终于出现,我得到这个错误后,它接受我的登录。
如果我需要张贴整个用户模型,项目模型&控制器和供应商模型,以便能够回答问题,如果我的查询是正确的,或者揭示有关此错误的更多信息,让我知道,我会添加它们。我试图保持更简单的条款,使它更容易,如果可能的话,但如果不能做到这一点,我很乐意提供其余的。
提前感谢任何可以帮助的人。
斯科特
感谢@engineersmnky
这个查询成功了:
Project.joins(:vendor)
.where(projects: {vendor_id: vendor_id})
.or(
Project.joins(:vendor)
.where(vendors: {parent_vendor_id: vendor_id})
)
很抱歉回复晚了。
非常感谢你的帮助。
斯科特