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')

どうすればこれを達成できますか?

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. 大量のsを使用する代わりにOR、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 に答える