2016-03-25 7 views
0

私はPhotoモデルオブジェクトの長い配列を持っています。created_atで並べ替え、最初に21個の写真で新しい配列を取得します。Ruby/rail sort_byは正しく注文されていませんか?

私の問題は、最終アレイが正しく注文されていないことです。ここで

は私のコードです:私はプリントアウトしたときに

@recent_photos = photos.sort_by(&:created_at).reverse.first(21) 

@recent_photoscreated_at値は次のように命じています

1458948707 
1458943713 
1458947042 
1458945171 
... 

オブジェクトをソートする正しい方法は何ですか?

UPDATE:ここ

は、初期リストがコンパイルされる方法は次のとおりです。

photos = @user.photos 
@following = @user.following 
@following.each do |f| 
    photos += f.photos if f.id != @user.id 
end 
@user.memberships.each do |group| 
    photos += group.photos 
end 

SOLUTION:

問題質問していました - 私はtimestampないcreated_atでソートしたい、そして、それらのあったtimestamp出力の値

+0

ソートは私が見ることのできるところからはうまくいくはずです、あなたの '' created_at''はどのクラスタイプですか? –

+0

idk、それはRailsによって自動生成されましたが、その文字列が問題の可能性がありますか? – Cbas

+0

'' photos.map(&:created_at).first(21) ''を実行して貼り付けることができますか?あなたのソートは、私が何かを紛失していない限り、間違いなく正しい順序でなければなりません。 –

答えて

3

試行:

@recent_photos = Photo.order('created_at desc').first(21) 
+0

「写真」を直接照会することはできません。b/c最初の写真リストは、SQLで照会できないオブジェクトの選択されたグループです。 – Cbas

+1

ああ - これを見ると...建物の作り方を示すことができますか?オブジェクトの配列? – toddmetheny

+0

okはそのコード – Cbas

4

あなたは、単一のクエリにそれをすべてダウンをクランチことができます。

@recent_photos = Photo.where(
    user_id: @user.following_ids 
).order('created_at DESC').limit(21) 

あなたは本当にそれが遅く、遅くなりますよう、人はより多くを持っているとして、これらのそれぞれについて、N個のクエリを実行することにしたくありません彼らが従っている人々。彼らが1万人を追うならば、それはちょっとばかりの質問です。あなたのモデルに:through定義を追加した場合

あなたも直接写真を照会することができる場合があります

has_many :follower_photos, 
    class_name: 'Photo', 
    through: :followers 

は、あなたの制約があるものは何でも、可能な限り、あなたは一発で問い合わせることができます何かにそれらを煮詰めます。それが実用的ではない場合は、予測可能な数のクエリに到達してください。決してNではありません。

+0

を追加しましたが、同じクエリですべてのフォロワー写真、グループ写真、個人写真をどのように取得できますか?例はフォロワーのためのものです – Cbas

+0

人やグループを表す特異なテーブルがあるのが理想です。グループのスタブ「人」レコードを作成して回避するのが理想的です。また、STI(Single Table Inheritance)を使用して、同じテーブルに人とグループを結合することも、多態的なテーブルを使用して結合することもできますが、それはかなり面倒です。理想的には、STIアプローチが最も効果的です。 2つの異なるリレーションがある場合は、 '。or(...)'メソッドでそれらを結合して、別の条件セットを追加することができます。 – tadman

+0

パフォーマンス上の理由から、私は可能な限り状況を避ける傾向があります。 MySQLは、2つの結果セットを結合して使用する場合、それらをソートするために多くの作業を行う必要があります。 'WHERE'と' ORDER BY'基準に索引を付けることができれば、単一の表を使用するほうが効率的です。 – tadman

関連する問題