Come specificare un meno di oggi la condizione di una data in rails record attivo

Sto cercando di capire come estrarre tutti i record nel mio set dove i loro campi “pubblica” è vero, e la “scadenza” è meno di quello di oggi. Ho il seguente, ma non credo che il meno di parte funziona, qualcuno può per favore indicarmi la strada giusta?

  @announcements = Announcement.where(:publish => true, :expires < Date.today)

Grazie in anticipo per il vostro aiuto

InformationsquelleAutor Adam | 2011-12-10

 

2 Replies
  1. 50

    Provare questo:

    @announcements = Announcement.where("publish = ? AND expires < ?", true, Date.today)
    • Questo sembra aver risolto il mio problema del record, ma ha causato un problema quando ho provato a chiamare l’elenco in una vista. Questo è niente a che fare con l’istruzione, o il modo in cui sto creando questo filtro nel controller?
    • QLite3::SQLException: no such colonna: vero: SELEZIONARE “annunci”.* DA “annunci” DOVE (pubblicazione = true E scade < ‘2011-12-10’) Estratti di origine (intorno alla linea #25): 22: <div class=”clear”></div> 23: 24: <ul id=”annunci” class=”list-tipo 1″> 25: <% @annunci.ogni do |annuncio| %> 26: <li> 27: <%= link_to annuncio.titolo, announcement_path(annuncio) %> 28: </li>
    • Io non sono un SQL-guru, quindi ti consiglio di farlo come questo, invece @announcements = Announcement.where("publish = ? AND expires < ?", true, Date.today)
    • Ha funzionato, grazie per il vostro aiuto!
    • Mi piacerebbe andare con: @annunci = Annuncio.dove(pubblica: il vero).where(“scade < ?”, Data.oggi), mi piace solo tasto cancelletto valori più credo 🙂
  2. 26

    Dal momento che questo è primo su google ho pensato di carillon. Probabilmente è meglio fare affidamento su Arel in questa circostanza.

    expires = Announcement.arel_table[:expires]
    @announcements = Announcement.where(:publish => true)
      .where(expires.lt(Date.today))

    Creare la seguente query SQL

    -- Using Arel
    SELECT "announcements".* FROM "announcements" 
    WHERE "announcements"."publish" = 't' 
      AND ("announcements"."expires" < '2016-02-03 18:41:26.454325')
    
    -- Contrast that with the string binding method mentioned above
    SELECT "announcements".* FROM "announcements"
    WHERE (publish = 't' AND expires < '2016-02-03 18:41:26.454325')

    I nomi di colonna sono pienamente qualificati, in modo da evitare conflitti durante la composizione di altre query in cima a questa ActiveRecord::Relazione io.e @announcements

    • Questo è impressionante, mi chiedo come fare questo, elegantemente per qualche tempo.
    • E credo che arel_table[:expires] potrebbe essere un metodo di una classe expires_column l’Annuncio, così si potrebbe .where(Announcement.expires_column.lt(Date.today)). Sarebbe un po ‘ più riutilizzabili, forse.
    • concordato. Vi consiglio questo gioiello github.com/camertron/arel-helpers. Invece di generare metodi, è possibile accedere come un hash che legge molto bello ad esempio Announcement[:expires]. Inoltre consiglio vivamente a giocherellare con http://www.scuttle.io
    • tu sei il mio eroe.

Lascia un commento