ruby-on-rails - Ruby/Rails - 链接未知数量的方法调用

标签 ruby-on-rails ruby

我想从作为参数传递到方法中的二维数组动态创建(可能很复杂)Active Record 查询。换句话说,我想接受这个:

arr = [
    ['join', :comments],
    ['where', :author => 'Bob']
]

并创建与此等效的内容:

Articles.join(:comments).where(:author => 'Bob')

一种方法是:

Articles.send(*arr[0]).send(*arr[1])

但是,如果 arr 包含 3 个嵌套数组,或者 4 个,或者 5 个呢?一个非常不完善的方法是这样做:

case arr.length
    when 1
        Articles.send(*arr[0])
    when 2
        Articles.send(*arr[0]).send(*arr[1])
    when 3
        Articles.send(*arr[0]).send(*arr[1]).send(*arr[2])
    # etc.
end

但是是否有更简洁、更简洁的方式(无需多次访问数据库)?也许有某种方法可以在执行它们之前构建一系列方法调用?

最佳答案

一种方便的方法是使用散列而不是二维数组。

像这样

query = {
  join: [:comments],
  where: {:author => 'Bob'}
}

这种方法并不复杂,如果 key 未提供或为空,您无需担心

Article.joins(query[:join]).where(query[:where])
#=> "SELECT  `articles`.* FROM `articles` INNER JOIN `comments` ON `comments`.`article_id` = `articles`.`id` WHERE `articles`.`author` = 'Bob'"

如果键为空或根本不存在

query = {
  join: []
}

Article.joins(query[:join]).where(query[:where])
#=> "SELECT  `articles`.* FROM `articles`"

或嵌套

query = {
  join: [:comments],
  where: {:author => 'Bob', comments: {author: 'Joe'}}
}
#=> "SELECT  `articles`.* FROM `articles` INNER JOIN `comments` ON `comments`.`article_id` = `articles`.`id` WHERE `articles`.`author` = 'Bob' AND `comments`.`author` = 'Joe'"

关于ruby-on-rails - Ruby/Rails - 链接未知数量的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54069409/

相关文章:

ruby-on-rails - Rspec 将 View 参数传递给 Controller ​​规范

ruby-on-rails - minitest Controller 测试失败

mysql - 如何告诉 Rails 拥有一张只有一行的表

ruby-on-rails - 用于链接到命名空间中的模型的 yardoc 语法是什么?

ruby sqlite3 sinatra 无法执行 db :Migrate

ruby - 在数组中查找最常见的字符串

ruby-on-rails - 单击第二个带有 capybara 的模糊链接

ruby - 为什么 Gosu 隐藏我的鼠标指针?

ruby-on-rails - 获取网页时如何在Ruby中捕获 "Error during processing: buffer error"?

ruby - 从 Ruby 中的 shell 命令中删除换行符