Jak napisać instrukcję warunkową, aby uzyskać wszystkie rekordy, które zostały utworzone dzisiaj?
Jak napisać instrukcję warunkową, aby uzyskać wszystkie rekordy, które zostały utworzone dzisiaj?
Odpowiedzi:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Ta odpowiedź została zmodyfikowana, ponieważ odpowiedź Harisha Shetty była lepsza niż moja. Ponieważ moja odpowiedź jest akceptowana. Zaktualizowałem tę odpowiedź dla wsparcia społeczności
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
jest bardzo sprytny, poparłbym Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Jest sens robienia tego, aby manipulować czasem. Na przykład, jeśli testujesz, prawdopodobnie będziesz manipulować czasem, a wtedy pierwsza opcja nie zadziała. Chcesz uniknąć tego rodzaju przyszłych możliwych niepowodzeń, które prawdopodobnie zajmie trochę czasu debugowania.
Wiem, że to pytanie ma akceptowaną odpowiedź. Rozwiązanie zaproponowane w zaakceptowanej odpowiedzi może powodować problemy z wydajnością, gdy rozmiar tabeli wzrośnie.
Zazwyczaj w przypadku wyszukiwania na podstawie created_at
kolumny dodaj indeks do tabeli w pliku migracji.
add_index :posts, :created_at
Teraz, aby wyszukać rekordy utworzone dzisiaj:
Szyny 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Aby wyszukać posty utworzone w określonym dniu.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- LUB -------------
Dodaj metodę statyczną do swojego modelu
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Szyny 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- LUB -------------
Dodaj named_scope do swojego modelu
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
przykład w tym poście dotyczy tylko Rails 3, ponieważ wygląda na to, że znajduje się pod nagłówkiem Rails 2. W Railsach 2 powinieneś użyć named_scope
zamiast scope
. Ponadto, w Railsach 3, możesz równoważnie użyć metody klasy, def self.today where("created_at >= ?", Time.now.beginning_of_day) end
która prawdopodobnie jest czystsza niż użycie zasięgu w tym przypadku, ponieważ pozwala ci zrezygnować z lambdy.
Odpowiedź Mohita Jaina dostosowana do Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 ma all_day
pomocnika, który jest tutaj przydatny.
Post.where(created_at: Date.today.all_day)
lub
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)
To „namescopes” atrybut z rozszerzeniem 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
wygląda interesująco. Nie znalazłem do tego żadnej dokumentacji. Czy możesz podać link? W jaki sposób szyny wybierają kolumnę do porównania?
Aby zapytać o rekordy utworzone od dzisiaj
Użyj zakresu z arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
Wtedy możemy to wykorzystać
today_posts = Post.created_from_today
where('created_at >= now()')
znalazłby tylko elementy, w których w przyszłości znajdował się atrybut created_at.
.lteq(Time.zone.now.end_of_day))
.
W railsach 4.2.3 do pobierania rekordów utworzonych dzisiaj za pomocą mysql użyj następującego.
@usergoals = Goal.where ("userid =: userid and Date (created_at) =: date", {userid: params [: id], date: Date.today})
tutaj używam wielu warunków, jeśli chcesz, możesz je edytować dla jednego warunku.