Wie soll ich die bedingte Anweisung schreiben, wenn ich alle heute erstellten Datensätze abrufen möchte?
Wie soll ich die bedingte Anweisung schreiben, wenn ich alle heute erstellten Datensätze abrufen möchte?
Antworten:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Diese Antwort wurde geändert, da die Antwort von Harish Shetty besser war als meine. Als meine Antwort wird eine akzeptiert. Ich habe diese Antwort für die Community-Unterstützung aktualisiert
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
es sehr klug ist, würde ich unterstützen Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Es gibt einen Grund, wie Sie die Zeit manipulieren können. Wenn Sie beispielsweise testen, werden Sie wahrscheinlich die Zeit manipulieren, und dann funktioniert die erste Option nicht. Sie möchten diese Art von zukünftigem möglichen Fehler vermeiden, der wahrscheinlich einige Debug-Zeit in Anspruch nehmen wird.
Ich weiß, dass diese Frage eine akzeptierte Antwort hat. Die in der akzeptierten Antwort vorgeschlagene Lösung kann zu Leistungsproblemen führen, wenn die Tabellengröße zunimmt.
Wenn Sie Suchvorgänge basierend auf created_at
Spalten durchführen, fügen Sie in der Regel einen Index für die Tabelle in Ihrer Migrationsdatei hinzu.
add_index :posts, :created_at
So suchen Sie nach heute erstellten Datensätzen:
Schienen 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Zum Nachschlagen von Posts, die an einem bestimmten Tag erstellt wurden.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- ODER -------------
Fügen Sie Ihrem Modell eine statische Methode hinzu
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Schienen 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- ODER -------------
Fügen Sie Ihrem Modell ein named_scope hinzu
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
Beispiel in diesem Beitrag nur für Rails 3 gilt, da es so aussieht, als ob es sich unter der Überschrift Rails 2 befindet. In Rails 2 müssten Sie named_scope
eher als verwenden scope
. In Rails 3 können Sie auch eine Klassenmethode verwenden, def self.today where("created_at >= ?", Time.now.beginning_of_day) end
die wahrscheinlich sauberer ist als die Verwendung eines Bereichs in diesem Fall, da Sie auf das Lambda verzichten können.
Mohit Jains Antwort für Rails3 angepasst
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 hat einen all_day
Helfer, der hier nützlich ist.
Post.where(created_at: Date.today.all_day)
oder
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Dieser "Namescopes" das Attribut mit dem table_name
.
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
between_period
sieht interessant aus. Ich habe keine Dokumentation dafür gefunden. Können Sie einen Link angeben? Wie wählen Schienen die Spalte zum Vergleich aus?
Aus irgendeinem Grund funktionierte keine der anderen Lösungen in diesem Beitrag oder andere in StackOverflow für mich (unter Verwendung von Rails 4.2.4 und Ruby 2.2.3p173). Dies ist die einzige Abfrage, die ich mit meiner Postgres-Datenbank bearbeiten konnte:
Post.where("created_at >= TIMESTAMP 'now'")
Abfragen von Datensätzen, die ab heute erstellt wurden
Verwenden Sie den Bereich mit arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
Dann können wir es benutzen
today_posts = Post.created_from_today
where('created_at >= now()')
würde nur Elemente finden, bei denen das created_at in der Zukunft war.
.lteq(Time.zone.now.end_of_day))
.
Verwenden Sie in Rails 4.2.3 zum Abrufen der heute mit MySQL erstellten Datensätze Folgendes.
@usergoals = Goal.where ("Benutzer-ID =: Benutzer-ID und Datum (Erstellt_at) =: Datum", {Benutzer-ID: Parameter [: ID], Datum: Datum.Today})
Hier verwende ich mehrere Bedingungen, wenn Sie möchten, können Sie es für eine einzelne Bedingung bearbeiten.