如何在 ruby 中将数组作为单个参数传递?

How to pass array as individual arguments in ruby?

我正在尝试想出一种更优雅的方式来将数组元素作为单独的参数传递给方法。

到目前为止,我有以下代码:

def fetch_data(keywords)
  Product.where("name ILIKE ? AND type ILIKE ?", *construct_keywords(keywords))
end

def construct_keywords(keywords)
  keywords.map{ |keyword| "%#{keyword}%" }
end

这很好用,我知道 splat 运算符做得很好,但我想看看是否可以不使用那个丑陋的星号,而是重塑 return 的值 construct_keywords 以便 fetch_data 方法将数组元素识别为单独的参数。所以最终我希望它像:

def fetch_data(keywords)
  Product.where("name ILIKE ? AND type ILIKE ?", construct_keywords(keywords))
end

def construct_keywords(keywords)
  keywords.map{ |keyword| "%#{keyword}%" }
  # reshape above array in a way so that fetch_data will recognize each elements as arguments
end

提前致谢。

虽然这可能很方便,但无法直接告知您的 return 值将如何使用并“预先显示”。这是被调用的方法必须实现的东西。

您可能想探索使用基于关键字的占位符,例如 name ILIKE :name,然后您可以在其中创建匹配的散列。

现在,您将任意数量的 keywords 传递给一个方法,该方法 return 是一个任意大小的结果数组,然后它会绑定到恰好两个位置的查询。好像很容易失败。

使用 [ :name, :type ].zip(keywords.map { ... }).to_h 给你一些东西,当然,假设你有两个关键字参数。

虽然可能需要一些重构,但很难搞砸的形式如下所示:

def fetch_data(name:, type:)
  Product.where("name ILIKE :name AND type ILIKE :type", name: name, type: type)
end

其中必须指定那些关键字参数,并且只能有两个。