0

問題の簡単な説明:

find()ActiveRecord のドキュメントには、次のように、オブジェクト メソッドに複数の値を渡すことができることが示されています。

Person.find(1, 2, 6) # returns an array for objects with IDs in (1, 2, 6)

私の問題は、返されたオブジェクトが、渡した値の順序に影響されないことです。

たとえば、Person.find(1, 2, 6)とまったく同じものを返しますPerson.find(6, 1, 2)

この種の検索順序を機密にする方法はありますか?

の配列を渡し、同じ順序でオブジェクトidの配列を取得する方法が必要なように感じます...Person

読み物に興味がある人のためのより広い文脈:

私がより一般的にしようとしているのはPerson、特定の期間に「最も閲覧された」オブジェクトを見つけることです。

これが私が持っているものです:

@most_viewed = View.where('created_at < ?', Time.now - 1.week).group(:person_id).order('count_person_id desc').count('person_id').keys

idこれは、オブジェクトの値の (順序付けられた!) 配列を、それぞれが先週受け取ったPerson数の降順で返します。ViewsPerson

id私の考えでは、このs の配列をPerson.findメソッドに渡すことができれば、私は家から解放されます! しかし、もっと簡単に行う別の方法があるかもしれません。私はすべての考えにオープンです。

ありがとう!

4

1 に答える 1

1

クエリから戻る代わりに、それ自体idsを返すことができます。views

@most_viewed = View.where('created_at < ?', Time.now - 1.week)
  .group(:person_id).order('count_person_id desc').includes(:person)

@most_viewedこれで人が並べられましたが、変数を介してそれらにアクセスする必要があります。

@most_viewed.each do |view|
  # do something with view.person
end

編集:

上記の解決策がうまくいかない場合は、この方法で人を注文できます

Person.find([6, 1, 2]).index_by(&:id).slice(*[6, 1, 2]).values

しかし、注文はクエリではなくルビーで行われています。

于 2013-08-30T00:30:52.657 に答える