【问题标题】:Wrong number of bind variables complication in RubyRuby 中错误的绑定变量数量
【发布时间】:2011-05-17 16:35:30
【问题描述】:

我有一个表,我通过 Ruby 查找函数在其中获取表的所有列表。

conditions = [Project.in_used_projects(:alias => "projects") + " AND name LIKE ? test"]
projects = Project.find(:all, :conditions => conditions)

但是当我添加“AND name LIKE ? test”时,我得到错误数量的绑定变量。 Project.in_used_projects 函数返回值:projects.status = 2

我不能只将 Project.in_used_projects 更改为 project.status = 2,因为每个项目的值都不同。 我得到的错误是:

wrong number of bind variables (0 for 1) in: (projects.status = 2) AND name LIKE ? test

我知道绑定变量的格式需要:(参数,参数,变量,变量)但我需要它是(参数,变量,参数,变量)

有什么想法吗?

【问题讨论】:

    标签: mysql ruby-on-rails binding conditional-statements


    【解决方案1】:

    在我看来,您确实有错误数量的绑定变量。您有 1 个问号,但有 0 个绑定变量。假设您正在某处寻找带有“test”的名称,则需要将“test”作为绑定变量,或对其进行硬编码,如下所示(0 个绑定变量,0 个插槽):

    [Project.in_used_projects(:alias => "projects") + " AND name LIKE '%test%'"]
    

    或者像这样(1个绑定变量,1个槽):

    [Project.in_used_projects(:alias => "projects") + " AND name LIKE ?", '%test%']
    

    【讨论】:

    • 哈哈,天哪。看来你确实是对的。我不敢相信我犯了这样一个新手错误。而这一切都是在我寻找另一种解决方案的时候。叹。再次感谢。我想我真的需要睡觉了。
    • 不使用字符串,而是使用变量呢?所以它会是“ AND name LIKE ?”,“%#{query}%”。所有这些都是顺便说一句的观点。是否可以将参数传递到视图中?
    • @JayG,是的,您可以使用这样的变量。这就是为什么你会使用“?”。如果您提前知道这个词是“测试”,那么您可以像我的第一个示例一样安全地对其进行硬编码。但是如果你不知道,硬编码是不安全的,所以你应该使用第二个例子中的参数(但是,正如你所说,用"%#{query}%"替换'%test%'
    • 您可以轻松地将变量传递到视图中。控制器和视图共享实例变量。所以只需在控制器中设置一个实例变量,如@something = 'asdf'。然后在视图中您可以使用@something 访问它。但我认为你做错了。像上面这样调用 sql 的查找器绝对不应该出现在视图中。最好的情况是,您将它们放入模型中。如果这是不可能的,你把它们放在一个控制器中。但是你永远不应该把它们放在视图中。
    • 视图还可以访问控制器拥有的相同的params哈希,以及requestresponsecookiessessioncontroller等。 ..与控制器几乎相同的环境。但是同样,您应该将所有逻辑都保留在视图之外,并将几乎所有逻辑都保留在控制器之外。绝大多数代码逻辑都属于模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多