2012-08-28 62 views
0

我覺得這個問題應該有一個簡單的答案,但我一直無法管理。RoR查詢條件:不包含任何屬性列表

我有3個模型:用戶,課程和教科書。我的模特協會工作得很好,但如果有必要的話我會包括他們。在我的應用程序中,我想要一個視圖來顯示用戶擁有教科書的課程以及用戶不擁有教科書的所有其他課程。在僞代碼,它應該看起來像

@courses_with_books = current_user.textbooks 
@courses_without_books = current_user.courses.where(:id != @courses_with_books.course_ids) 

我可以使用複雜的迴路完成該退居二線,但過程似乎傻了,所以我一直在研究一個方法來收集我需要一個單一的查詢,還沒有信息一無所獲。在此先感謝:d

回答

1

在一般情況下,如果你想查詢一些屬性是不是有些定collection的內部,嘗試「NOT IN」:

current_user.courses.where("id NOT IN ?", @courses_with_books.course_ids) 

更多關於活動記錄查詢,檢查出the Active Record Query Interface Guide

+0

所以利用這兩個你的建議,我做了以下內容: array = curent_user.textbooks.collect(&:course_id) courses_without_books = current_user.courses.where('id not in?',array) 這個運行沒有錯誤,但是當我在視圖中顯示<%= courses_without_books%>時, #就是所有的問題。我需要通過做一些類似於<%= @ courses_without_books.title%>的顯示課程標題,但是這會導致錯誤: SQLite3 :: SQLException:模棱兩可的列名:id – mattwd7

+0

我對此不太確定,但有時候,當處理不止一個表時,可能會出現模糊性問題,因爲不清楚是哪個「id」引用,因爲這兩個表都有一個名爲'id'的屬性。因此,在查詢中顯式添加表名是一個不錯的主意。所以你的新語句可能看起來像這樣:'current_user.courses.where(「courses.id NOT IN?」,@ courses_with_books.course_ids)''。也看看varatis的答案。 – rathrio

+0

錯誤發生的原因可能是因爲延遲加載(google瞭解更多詳細信息)。 ActiveRecord實際上並沒有在關係上執行查詢,除非你用它「做」某些事情,比如迭代它並在視圖中顯示它。儘管如此,這對所有類型的查詢都是不正確的。 – rathrio

0

rathrio是在正確的道路上。我認爲第一部分,你可以做

@courses_with_books = current_user.textbooks.collect(&:course)

如果你想顯示自己的title S,做

<% @courses_with_books.each do |cwb| %> 
    <%= cwb.title %> 
<% end %> 
+0

因此,利用這兩個建議,我做了以下幾點: array = curent_user.textbooks.collect(&:course_id) courses_without_books = current_user.courses.where('id not in?',array) 這樣運行時沒有錯誤,但是當我在視圖中顯示<%= courses_without_books%>時,所有出現的都是#。我需要通過類似<%= @ courses_without_books.title%>的方式來顯示課程標題,但這會導致錯誤: SQLite3 :: SQLException:模糊的列名稱:ID – mattwd7

+0

查看更新的答案。這是否能解決您的問題?請注意@courses_without_books是一系列課程。它沒有任何「標題」屬性。 – varatis