2012-06-27 46 views
5

Tôi đang sử dụng Ruby on Rails 3.2.2 và tôi muốn biết nếu trong các phương pháp phạm vi có thể "tự động" tham gia một bảng chỉ khi bảng đó chưa được tham gia. Đó là nó, tôi có:Chỉ có thể "tự động" tham gia một bảng nếu bảng đó chưa được tham gia?

def self.scope_method_name(user) 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 

Tôi muốn thực hiện một cái gì đó như sau:

# Note: the following code is just a sample in order to understand what I mean. 
def self.scope_method_name(user) 
    if table_is_joined?(joining_table_name) 
    where("joining_table_name.user_id = ?", user.id) 
    else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
    end 
end 

Có thể/nên làm cho điều đó? Nếu có, tôi nên tiến hành như thế nào?


Tôi muốn sử dụng phương pháp này để tránh multiple database table statements in INNER JOIN of SQL queries (trong một số trường hợp có vẻ như để làm cho SQL của tôi truy vấn không làm việc như mong đợi kể từ khi nhiều báo cáo bảng) và như vậy để sử dụng scope_method_name mà không quan tâm liên quan đến truy vấn SQL liên quan (trong trường hợp của tôi, mà không cần quan tâm để tham gia các bảng cơ sở dữ liệu).

Note: Nó có thể gây lỗi SQL (ví dụ, các lỗi như giống như "ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'") khi bạn có chưa tham gia bảng cơ sở dữ liệu (ví dụ, điều này có thể xảy ra khi bạn chạy mã như ClassName.scope_method_name(@user)mà trước đó không tham gia số joining_association_name và vì vậy mà không cần tham gia bảng joining_table_name có liên quan).

Trả lời

-1

Phương thức loaded? ở đâu để kiểm tra xem một liên kết đã được tải chưa. Bạn có thể thử sử dụng nó.

if association_name.loaded? 
    where("joining_table_name.user_id = ?", user.id) 
else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 
+0

Mã của bạn có tránh lỗi SQL hay không cơ sở dữ liệu ") khi bạn có * chưa tham gia * bảng cơ sở dữ liệu (ví dụ, điều này có thể xảy ra khi bạn chạy mã như' ClassName.scope_method_name (@user) '* mà không cần trước đó * tham gia' join_association_name' và vì vậy mà không cần tham gia bảng 'join_table_name' có liên quan)? – user12882

+0

Xin lỗi, tôi vừa thấy rằng bạn đang cố gắng sử dụng phạm vi. 'associ_name.loaded?' sẽ chỉ có sẵn cho một cá thể. Không thể trả lời câu hỏi của bạn ... nhưng đường ray sẽ không quan tâm đến việc không tải liên kết hai lần. – spas

+0

Dường như Rails không quan tâm "không tải liên kết hai lần", ít nhất là trong trường hợp [câu hỏi được liên kết] (http://stackoverflow.com/questions/11210241/what-means-happens-when -using-the-inner-join-với-nhiều-cơ sở dữ liệu-bảng-st? lq = 1) (đọc ý kiến). – user12882