3

以下のクエリを使用して、ID のコレクションに基づいて複数のテーブルからレコードを取得しようとしていますが、正常に動作しています。

アクティブ レコード クエリ:

Song.order("songs.id desc")。includes(:アーティスト).includes(:アルバム). joins("LEFT JOIN アーティスト ON songs.artist_id = artist.id"). joins("LEFT JOIN アルバム ON songs.album_id = albums.id"). where("(songs.id)

IN (#{song_ids*','})

AND (LOWER(songs.title) LIKE :term OR LOWER(artists.name) LIKE :term OR LOWER(albums.title) LIKE :term)", :term => "%#{terms[index].downcase}% ")

PG クエリ出力:

SELECT "songs".* FROM "songs" LEFT JOIN アーティスト ON 曲.artist_id = artist.id LEFT JOIN アルバム ON 曲.album_id = albums.id WHERE (

(songs.id) IN (4,5,28,37,46,48)

AND (LOWER(songs.title) LIKE '%wo%' OR LOWER(artists.name) LIKE '%wo%' OR LOWER(albums.title) LIKE '%wo%')) ORDER BY song.id desc

しかし、以下の

ACTIVE RECORD QUERYのようにクエリを変更しようとしていたとき:

Song.order("songs.id desc")。includes(:アーティスト).includes(:アルバム). joins("LEFT JOIN アーティスト ON songs.artist_id = artist.id"). joins("LEFT JOIN アルバム ON songs.album_id = albums.id"). where("(songs.id)

IN (:song_ids)

AND (LOWER(songs.title) LIKE :term OR LOWER(artists.name) LIKE :term OR LOWER(albums.title) LIKE :term)",

      :term => "%#{terms[index].downcase}%",:song_ids => song_ids*',')

PG クエリ出力:

SELECT "songs".* FROM "songs" LEFT JOIN アーティスト ON 曲.artist_id = artist.id LEFT JOIN アルバム ON 曲.album_id = albums.id WHERE (

(songs.id) IN ('4,5,28,37,46,48')

AND (LOWER(songs.title) LIKE '%wo%' OR LOWER(artists.name) LIKE '%wo%' OR LOWER(albums.title) LIKE '%wo%')) ORDER BY song.id desc

一重引用符のため、上記のクエリは機能しません。

4

1 に答える 1

1

に置き換え:song_ids => song_ids*','てみてください:song_ids => song_ids

元のコードでは、song_ids を文字列に変換しました。これはエスケープされ、文字列であることを示すために単一引用符が付けられました。これは引数として配列のみを渡し、レールは魔法をかけて、それをこの 4,5,28,37,46,48 のようなものに変換します (まだ括弧が必要です)。

于 2013-06-19T01:23:00.660 に答える