Rails:使用数组查询

时间:2012-11-15 01:22:37

标签: mysql ruby-on-rails-3

我有以下创建并执行SQL查询的方法:

def edition_authors(edition, authors)
  query_string = "contributor_type = ? AND author = ?"
  for i in 1..authors.length - 1
    query_string += " OR author = ?"
  end
  return edition.contributors.where(query_string, 'Author', authors)
end

最后一行是我遇到麻烦的那一行。我希望'authors'数组以某种方式变成一组字符串。例如,如果作者数组包含['James Joyce','Cory Doctorow','Cormac McCarthy'],我希望最后一行如下:

return edition.contributors.where(query_string, 'Author', 'James Joyce', 'Cory Doctorow', 'Cormac McCarthy')

我怎么能做到这一点?

2 个答案:

答案 0 :(得分:6)

取决于您正在使用的导轨和红宝石,

  1. ActiveRecord在Rails 3中已经具备此功能:Model.where(:my_field => ['Author', 'James Joyce', 'Cory Doctorow', 'Cormac McCarthy'])

  2. arr.map{|v| v.to_s.inspect}会为您提供以逗号分隔的列表

  3. arr.join(',')会给你一个逗号分隔的列表,没有引号。

  4. 然后你可以随意使用这个字符串。

答案 1 :(得分:2)

试试这个:

  1. 不使用大量的OR,而是使用SQL IN子句,
  2. 然后使用Array#join提供值
  3. 所以:

    .where("contributor_type = ? AND author IN (?)", 'Author', authors.join("','")) 
    

    应该做的诀窍,有一些警告:SQL IN子句中的字符串值需要单引号和逗号分隔SELECT * FROM fubar WHERE blah IN ('foo','bar','baz');我认为Rails很聪明地知道如何引用事物,所以查看Rails日志如果您收到错误,请查看正在生成的SQL。

    此外,由于你的值可能包含单引号(Georgia O'Keefe),我不确定Rails是否足够聪明,以这种方式使用时可以逃避这些。

    额外提示:确保Author列上有索引。一般来说,这是一个昂贵的查询。