我想从作为参数传递到方法中的二维数组动态创建(可能很复杂)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/