通过相关对象选择的正确方法

时间:2012-11-19 21:58:05

标签: ruby-on-rails activerecord

我想问一下,从给定货架上选择书籍的正确方法是什么

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)但这似乎不是很干,甚至有点冷......

2 个答案:

答案 0 :(得分: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但如果需要过滤的话,这将不起作用一个对象。“,我真的不明白)

答案 1 :(得分:0)

对于关系干燥,请查看delegation,其中从一个模型到另一个模型的引用被封装在其中一个模型中。关于这是否是解决实际问题的解决方案,我个人认为可以,但是自己决定。这篇文章很老但没有过时。