【问题标题】:How does rails activerecord where clause accepts dynamic parameter?rails activerecord where 子句如何接受动态参数?
【发布时间】:2020-03-10 10:22:36
【问题描述】:

在 ruby​​ web 中为方法定义参数。

def para_check(para1, para2, para3 .... )

end

activerecord.where是如何定义的,以便接受动态参数?

我浏览了一些博客/网站,但找不到有用的资源。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord methods dynamic


    【解决方案1】:

    有几种方法可以做到这一点。对于初学者,您可以接受散列或数组作为参数。

    所以如果你期待Hash,这就是where 所做的,你可以写

    def para_check(params) 
      params.each do |param_name, param_value|
        # do something with the params
      end 
    end 
    

    然后你可以写:

    para_check(para1: "X", para2: "Y", para5: "Z") 
    

    另一种选择,在这种情况下,如果您需要指定参数列表/数组,您还可以按如下方式定义您的方法:

    def para_check(*params)
      params.each do |param_name| 
        # do something with param_name
      end
    end 
    

    ('*' 运算符称为 splat 运算符)

    然后你调用你的方法如下

    para_check(:para1, :para2, :para4)     
    

    【讨论】:

      【解决方案2】:

      在 Ruby 中,您可以在参数前面加上一个 splat (*) 来定义接受任意数量位置参数的方法:

      def foo(*x)
        x
      end
      
      foo(1,2,3) == [1,2,3] # true
      

      这也称为variadic function。如您所见,这会从参数列表中创建一个数组。

      您还可以将编号和位置参数与 splat 结合起来:

      foo(bar, *args)
        [bar, args]
      end
      
      foo(1, 'a', 'b') == [1, ['a','b']] # true
      

      这使得该方法需要一个参数,但允许无限数量的参数。

      ActiveRecord::QueryMethods#where 方法接受位置参数和关键字参数:

      where('foo = :x OR bar = :y', x: 1, x: 2)
      

      从 Ruby 2.0 开始,您可以这样做:

      def foo(*args, **kwargs)
        [args, kwargs]
      end
      
      foo(1, 2, 3, bar: 'baz') == [[1, 2, 3], { bar: 'baz' }] ## true
      

      以前,您必须使用各种带有数组参数和可选哈希参数的 hacky 解决方案。您仍然可以在 Rails 源代码和在 Ruby 2.0 之前编写的许多其他代码中找到这些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多