2012-08-28 101 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