2012-11-19 36 views
0

选择我想问一下,什么是正确的方法从给定的货架有道通过相关对象

class Book < ActiveRecord::Base 
    belongs_to :shelf 
end 

class Shelf < ActiveRecord::Base 
    has_many :books 
end 

使用Book.where(:shelf => shelf)选择书籍引发像no such column: book.shelf例外。我知道我可以将其取消,如shelf.books,但如果需要通过多个对象进行过滤,则此功能无效。所有我能找到的是,查询应该看起来像Books.where(:shelf_id => shelf.id)但这似乎并不很干,甚至有点凉..

+0

你是什么意思,如果有需要过滤多个对象。你需要链条的条件? –

+0

我的回答帮助@ M4ks? – MrYoshiji

回答

1

您可以使用加入或包括:

Book.joins(:shelfs) # will load all the Books that have one Shelf 

Book.includes(:shelfs) # will load all the Books and Shelfs even if the book has no Shelf associated 

# or beginning with a Shelf object: 
@shelf.books # will return all Book where shelf_id = @shelf.id 

如果您需要精度/有问题,不要犹豫,以评论;)(我想你的短语“像shelf.books但这不会工作,如果有需要过滤多个对象。”我不真的了解)

+0

如果一本书属于类别,就像一个书架,并且您想从某些书架和某个类别中找到书籍:) 而且我需要来自某个书架的书籍(该书架对象是在其他地方创建的,无所谓)。 – M4ks

+0

so'join'them:'Book.joins(:categories).joins(:shelfs).where('categories.name =?AND shelfs.id =?','CategoryName',my_shelf_id)' – MrYoshiji

0

对于关系干燥,请参考delegation,其中从一个模型引用到nother被封装在其中一个模型中。关于这是否是一个真正问题的解决方案还有很多讨论,我个人认为它可以,但是为你自己决定。文章陈旧但不过时。