1

基本的に、タグ付けシステムを備えたアプリがあり、誰かがタグ「アナグマ」を検索すると、「アナグマ」、「アナグマ」、「アナグマ」のタグが付けられたレコードが返されます。単一のタグを使用して、これを実行してレコードを取得できます。

@notes = Tag.find_by_name(params[:tag_name]).notes.order("created_at DESC")

そしてそれはうまくいきます。ただし、複数のタグを取得した場合(これは大文字と小文字のみです-「s」ビットもまだわかりません):

Tag.find(:all, :conditions => [ "lower(name) = ?", 'badger'])

複数の結果があるため、 .notes.order("created_at DESC") を使用できません。ですから、問題は.... 1) 私はこれを正しい方法で行っていますか? 2) その場合、すべての記録を元に戻すにはどうすればよいですか?

どんな助けでも大歓迎です!

4

2 に答える 2

3

1 つの実装は次のようになります。

@notes = []
Tag.find(:all, :conditions => [ "lower(name) = ?", 'badger']).each do |tag|
  @notes << tag.notes
end
@notes.sort_by {|note| note.created_at}

ただし、これは N + 1 クエリと呼ばれるものであり、外側のセクションで 1 つのクエリを作成し、結果ごとに 1 つのクエリを作成することに注意してください。これは、最初のクエリを次のように変更することで最適化できます。

Tag.find(:all, :conditions => [ "lower(name) = ?", 'badger'], :includes => :notes).each do |tag|

Rails 3 以降を使用している場合は、少し書き直すことができます。

Tag.where("lower(name) = ?", "badger").includes(:notes) do |tag|
于 2012-07-19T20:15:42.923 に答える
0

編集済み

最初に、可能なすべてのタグ名、複数形、単数形、下位、上位の配列を取得します

tag_name = params[:tag_name].to_s.downcase
possible_tag_names = [tag_name, tag_name.pluralize, tag_name.singularize].uniq
# It's probably faster to search for both lower and capitalized tags than to use the db's `lower` function
possible_tag_names += possible_tag_names.map(&:capitalize)

タグ付けライブラリを使用していますか? 複数のタグを照会する方法を提供するものがあることは知っています。これらのいずれも使用していない場合は、クエリで手動で SQL 結合を行う必要があります (MySQL、Postgres、または SQLite などのリレーショナル データベースを使用していると仮定します)。喜んでお手伝いさせていただきますが、あなたのスキーマがわかりません。

于 2012-07-19T20:17:39.687 に答える