2009-08-16 39 views
16

Tôi có truy vấn SQL không phải là bảng cụ thể và tôi không biết cách xử lý nó bằng Ruby On Rails.Truy vấn SQL tùy chỉnh mà không tương ứng Bảng

đây truy vấn SQL của tôi (bạn không cần phải hiểu nó):

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

tôi đã cố gắng để tạo ra một mô hình và sử dụng một find_by_sql:


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

tôi nhận được:

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

Làm cách nào để tránh thông báo này? Có giải pháp thay thế nào không?

+0

Ý anh là gì, Tôi thấy các bảng trong truy vấn đó. –

+0

Không có bảng MySql nào có tên là recent_activities và tương ứng với mô hình. – collimarco

Trả lời

36

Bạn có thể lấy kết nối db trực tiếp từ ActiveRecord :: Base, nhưng nó không hữu ích như mở rộng AR :: Base, vì các phương pháp hữu ích như sanitize_sql được bảo vệ.

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

Cảm ơn! Chính xác những gì tôi đang tìm kiếm. – collimarco

+0

Tôi cũng vậy! Trên thực tế, sự kỳ quặc duy nhất ở đây là với hàng cuối cùng - bạn có thể sẽ muốn làm: results.each_hash {| h | in "# {h} \ n"} Trong truy vấn của tôi, .inspect không hiển thị gì. – aronchick

+0

Nếu h có dữ liệu trong đó, sau đó in hoặc in kết quả của h.inspect cả hai sẽ hoạt động. Bạn đã quên "đặt" trước h.inspect? – jdl

0

Nếu bạn muốn tạo các lớp học (mô hình) mà không phải là ủng hộ cho một cơ sở dữ liệu bạn cần không nói rằng họ được kế thừa từ ActiveRecord.

Do

class RecentActivity 

Thay vì

class RecentActivity < ActiveRecord::Base 

Điều đó đang được nói, nó vẫn có thể hữu ích để có được một số thông tin vào những gì bạn đang cố gắng làm: ví dụ nếu bạn muốn có một cái gì đó như "bình luận" hoặc "hình ảnh" trên nhiều thứ khác nhau như một bài viết, hoặc một số tiểu sử hoặc blogpost tất cả trong cùng một ứng dụng, tôi khuyên bạn nên kiểm tra ra PolyMorphic Associations.

+0

Điều tôi cần là thực hiện truy vấn trên và khởi tạo một số đối tượng có nội dung của nó. – collimarco

7

Bạn cũng có thể lấy các kết nối ActiveRecord và gọi select_all: "không bàn cụ thể"

ActiveRecord::Base.connection.select_all('select * from foo').each do |e| 
    puts e.inspect 
end 
Các vấn đề liên quan