Pertanyaan Rel Rekaman Aktif menemukan (: semua,: order =>) masalah


Sepertinya saya tidak dapat menggunakan opsi ActiveRecord :: Base.find: pesan untuk lebih dari satu kolom dalam satu waktu.

Sebagai contoh, saya memiliki model "Tampilkan" dengan tanggal dan kolom yang hadir.

Jika saya menjalankan kode berikut:

@shows = Show.find(:all, :order => "date")

Saya mendapatkan hasil sebagai berikut:

[#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 1, date: "2009-04-18", attending: 78>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]

Jika saya menjalankan kode berikut:

@shows = Show.find(:all, :order => "attending DESC")

[#<Show id: 4, date: "2009-04-21", attending: 136>,
 #<Show id: 2, date: "2009-04-19", attending: 91>,
 #<Show id: 1, date: "2009-04-18", attending: 78>,
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 7, date: "2009-04-18", attending: 2>]

Tapi, jika saya menjalankan:

@shows = Show.find(:all, :order => "date, attending DESC")

ATAU

@shows = Show.find(:all, :order => "date, attending ASC")

ATAU

@shows = Show.find(:all, :order => "date ASC, attending DESC")

Saya mendapatkan hasil yang sama karena hanya menyortir berdasarkan tanggal:

 [#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 1, date: "2009-04-18", attending: 78>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]

Di mana, saya ingin mendapatkan hasil ini:

[#<Show id: 1, date: "2009-04-18", attending: 78>,
#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]

Ini adalah kueri yang dihasilkan dari log:

[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1[0m
[4;36;1mShow Load (3.0ms)[0m   [0;1mSELECT * FROM "shows" ORDER BY date ASC, attending DESC[0m
[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 1) [0m

Akhirnya, inilah model saya:

  create_table "shows", :force => true do |t|
    t.string   "headliner"
    t.string   "openers"
    t.string   "venue"
    t.date     "date"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.decimal  "price"
    t.time     "showtime"
    t.integer  "attending",   :default => 0
    t.string   "time"
  end

Apa yang saya rindukan? Apa yang saya lakukan salah?

PEMBARUAN: Terima kasih atas semua bantuan Anda, tetapi tampaknya Anda semua bingung sama seperti saya. Apa yang memecahkan masalah sebenarnya adalah pengalihan basis data. Saya beralih dari sqlite3 default ke mysql. 


75
2018-04-13 00:25


asal


Jawaban:


Saya perhatikan bahwa dalam contoh pertama Anda, yang sederhana : order => "date", rekam 7 disortir sebelum merekam 1. Urutan ini juga bagaimana Anda melihat hasil dalam jenis multi-kolom, terlepas dari apakah Anda menyortir dengan menghadiri.

Ini tampaknya masuk akal bagi saya jika tanggalnya tidak persis sama, dan tanggalnya 7 sebelum tanggalnya 1. Alih-alih menemukan bahwa tanggals sama persis kemudian melanjutkan untuk mengurutkan menghadiri, kueri menemukan bahwa tanggal tidak sama dan hanya mengurutkan seperti itu seperti semua catatan lainnya.

Saya melihat dari penjelajahan di sekitar bahwa SQLite tidak memiliki pemahaman asli tentang tipe data DATE atau DATETIME dan sebaliknya memberi pengguna pilihan angka atau teks floating point yang harus mereka uraikan sendiri. Mungkinkah representasi literal dari tanggal dalam database tidak persis sama? Kebanyakan orang sepertinya perlu gunakan fungsi tanggal sehingga tanggal berperilaku seperti yang Anda harapkan. Mungkin ada cara untuk membungkus pesanan Anda dengan kolom dengan fungsi tanggal yang akan memberi Anda sesuatu yang konkret untuk dibandingkan, seperti tanggal (tanggal) ASC, menghadiri DESC. Saya tidak yakin bahwa sintaks bekerja, tetapi ini adalah area yang perlu diperhatikan untuk memecahkan masalah Anda. Semoga itu membantu.


36
2018-04-13 16:36



Bisa jadi dua hal. Pertama,

Kode ini tidak berlaku lagi:

Model.find(:all, :order => ...)

seharusnya:

Model.order(...).all

Temukan tidak lagi didukung dengan: semua,: pesanan, dan banyak opsi lainnya.

Kedua, Anda mungkin memiliki default_scope yang menegakkan beberapa pemesanan sebelum Anda menelepon find di Show.

Jam-jam penggalian di internet membawa saya ke beberapa artikel berguna yang menjelaskan masalah ini:


44
2018-01-14 02:49



Masalahnya adalah tanggal adalah kata kunci sqlite3 reserved. Saya memiliki masalah serupa dengan waktu, juga kata kunci cadangan, yang bekerja dengan baik di PostgreSQL, tetapi tidak dalam sqlite3. Solusinya adalah mengganti nama kolom.

Lihat ini: Sqlite3 activerecord: order => "time DESC" tidak mengurutkan


14
2018-04-28 10:52



Saya baru saja mengalami masalah yang sama, tetapi saya berhasil membuat kueri saya bekerja di SQLite seperti ini:

@shows = Show.order("datetime(date) ASC, attending DESC")

Saya harap ini dapat membantu seseorang menghemat waktu


4
2018-02-13 21:44



bukan hanya itu :order => 'column1 ASC, column2 DESC'?


3
2018-04-13 00:46



Pastikan untuk memeriksa skema di tingkat basis data secara langsung. Saya telah dibakar oleh ini sebelumnya, di mana, misalnya, migrasi pada awalnya ditulis untuk membuat: kolom tanggal, dan saya menjalankannya secara lokal, lalu tweak migrasi ke: tanggal sebelum benar-benar digunakan. Jadi database semua orang terlihat baik kecuali milikku, dan bugnya halus.


3
2018-04-15 22:39



Saya mengerti mengapa dev Rails pergi dengan sqlite3 untuk implementasi out-of-the-box, tetapi MySQL jauh lebih praktis, IMHO. Saya menyadari itu tergantung pada apa yang Anda membangun aplikasi Rails Anda untuk, tetapi kebanyakan orang akan beralih file database.yml default dari sqlite3 ke MySQL.

Senang Anda menyelesaikan masalah Anda.


2
2018-04-18 21:34



Adalah baik bahwa Anda telah menemukan solusi Anda. Tapi itu masalah yang menarik. Saya mencoba sendiri langsung dengan sqlite3 (tidak melalui rel) dan tidak mendapatkan hasil yang sama, bagi saya pesanan keluar seperti yang diharapkan.

Apa yang saya sarankan Anda lakukan jika Anda ingin terus menggali dalam masalah ini adalah untuk memulai aplikasi baris perintah sqlite3 dan memeriksa skema dan pertanyaan di sana:

Ini menunjukkan skema: .schema

Dan kemudian jalankan pernyataan pilih seperti yang muncul di file log: SELECT * FROM "shows" ORDER BY date ASC, attending DESC

Dengan begitu Anda akan melihat jika:

  1. Skema terlihat seperti yang Anda inginkan (tanggal itu sebenarnya adalah tanggal misalnya)
  2. Bahwa kolom tanggal sebenarnya berisi tanggal, dan bukan stempel waktu (yaitu, bahwa Anda tidak memiliki waktu pada hari yang mengacaukan semacam itu)

2
2018-04-21 08:33



Ini mungkin membantu juga:

Post.order(created_at: :desc)

0
2017-07-22 18:35