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

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

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

我怎么能做到这一点?

4

2 回答 2

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(',')会给你一个逗号分隔的列表,没有引号。

然后你可以随心所欲地使用这个字符串。

于 2012-11-15T01:50:50.787 回答
2

试试这个:

  1. 不要使用一大堆ORs,而是使用 SQLIN子句,并且
  2. 然后用于Array#join提供值

所以:

.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列上有索引。一般来说,这是一个昂贵的查询。

于 2012-11-15T01:58:17.043 回答