Witam
Mam tablicę user.posts, w której trzymam wiele elementów klasy Post(id: integer, text: text, user_id: integer, title: string, created_at: datetime, updated_at: datetime)
Chcę z tego otrzymać tablicę elementów klasy Post spełniających warunek: text ~= /regexp/i OR title ~= /regexp/i
Jak coś takiego osiągnąć? Czy metoda select będzie tu użyteczna?
jakoś tak:
reg = /regexp/i
tablica_postów.select{|post| post.text =~ reg || post.title =~ reg }
- to baza danych odpowiedzialna jest za wykonanie regexpa na kolekcji, robienie tego przy użyciu Ruby to morderstwo serwera gdy kolekcja urośnie (zeżre całą pamięć)
- można zastosować named_scope, będzie ładniej niż select
[code=ruby]class Post
named_scope :matching_text, lambda { |text|
unless text.blank?
{ :conditions => [“text like ? OR title like ?”, “%#{text}%”, “%#{text}%”] }
end
}
end
użycie
Post.matching_text(“test”).all[/code]
A ten kod zadziała pod Rails 3 i potem w Rails 3.1? W jakimś którymś ze screencastów się natknąłem na wiadomości, że w nowym ActiveRecord :conditions zastąpiła metoda #where.
Jeśli w modelu mam zapisane, że User ma wiele Postów i Post należy do Usera, to czy da się wyodrębnić szukane wiadomości operacjami na tablicy user.posts, czy muszę działać SQLem bezpośrednio na modelu Post?
…tylko zwróć uwagę, że w przykładzie nie jest regexp tylko jego SQLowy odpowiednik, gdzie znakami specjalnymi jest procent i podkreślenie.
Możesz (i powinieneś) zrobić:
user.posts.where(...)
lub jeszcze lepiej ze scopem.