2009-08-16 10 views
16

Mam zapytanie SQL, które nie jest specyficzne dla tabeli i nie wiem, jak sobie z tym poradzić z Ruby On Rails.Niestandardowe zapytanie SQL bez odpowiedniej tabeli

Oto moje zapytanie SQL (nie trzeba go zrozumieć):

SELECT type, actor_id, events.created_at, photo_id, photos.user_id FROM 
(SELECT 'comment' AS type, user_id AS actor_id, created_at, photo_id FROM comments 
UNION 
SELECT 'classification' AS type, user_id AS actor_id, created_at, photo_id FROM classifications) 
AS events 
INNER JOIN photos ON photo_id = photos.id 
WHERE user_id = #{@user.id} 
ORDER BY created_at DESC 
LIMIT 9

Starałem się stworzyć model i używać find_by_sql:


class RecentActivity ActiveRecord::Base 
    attr_accessor :type, :actor_id, :created_at, :photo_id, :user_id 
end 

uzyskać:

Mysql::Error: Table 'mysite_development.recent_activities' doesn't exist: SHOW FIELDS FROM `recent_activities`

Jak mogę uniknąć tej wiadomości? Czy istnieje jakieś alternatywne rozwiązanie?

+0

Co masz na myśli, Widzę tabele w tym zapytaniu. –

+0

Nie ma żadnej tabeli MySQL, która nazywa się recent_activities i odpowiada modelowi. – collimarco

Odpowiedz

36

Możesz pobrać połączenie db bezpośrednio z ActiveRecord :: Base, ale nie jest to tak użyteczne jak rozszerzenie AR :: Base, ponieważ pomocne metody, takie jak sanitize_sql, są chronione.

class ComplexQueries < ActiveRecord::Base 
    def self.my_query 
    # Notice how you can, and should, still sanitize params here. 
    self.connection.execute(sanitize_sql(["select * from foo limit ?", 10])) 
    end 
end 

results = ComplexQueries.my_query 
results.each_hash{|h| puts h.inspect} 
+0

Dzięki! Dokładnie to, czego szukałem. – collimarco

+0

Ja też! Właściwie jedynym dziwactwem jest tutaj ostatni wiersz - prawdopodobnie będziesz chciał: result.each_hash {| h | print "# {h} \ n"} Na moje zapytanie, .inspect nic nie pokazał. – aronchick

+0

Jeśli h zawiera dane, to drukowanie lub drukowanie wyników h.inspect będzie działać. Czy zapomniałeś o "puts" przed h.inspect? – jdl

0

Jeśli chcesz utworzyć klasy (modele), które nie są do tworzenia kopii bazy danych trzeba stwierdzić, że nie są one dziedziczy z ActiveRecord.

Czy

class RecentActivity 

Zamiast

class RecentActivity < ActiveRecord::Base 

Powiedział, że jest to nadal może być pomocne, aby uzyskać trochę więcej informacji na temat tego, co staramy się robić na przykład: jeśli chcesz mieć coś takiego jak "komentarze" lub "zdjęcia" w wielu różnych rzeczach, takich jak artykuł, czy profil kogoś lub blog w całej tej samej aplikacji, polecam sprawdzenie PolyMorphic Associations.

+0

To, czego potrzebuję, to wykonanie powyższej kwerendy i utworzenie instancji niektórych obiektów wraz z zawartością. – collimarco

7

Można również pobrać połączenia ActiveRecord i nazywają select_all: "nie table-specific"

ActiveRecord::Base.connection.select_all('select * from foo').each do |e| 
    puts e.inspect 
end