这是我的模特:
class Book < ActiveRecord::Base
attr_accessible :author, :title
validates :author, presence: true
validates :title, :uniqueness => true, presence: true
has_many :rentals
def rent?
rentals.where(return_date: nil).count > 0
end
end
class Rental < ActiveRecord::Base
belongs_to :student
belongs_to :book
validates :student, presence: true
validates :book, presence: true
validates :rental_date, presence: true
attr_accessible :rental_date, :return_date, :student, :book
def pending?
return return_date == nil
end
def overdue?
if(return_date)
return_date - rental_date > 7.days
else
Time.now - rental_date > 7.days
end
end
end
我想查询所有不在租金中的书籍(即本书没有租借没有return_date)。
我以为我可以用我的“租金”?方法,但我无法使它工作,所以我试图加入。
这就是我得到的:
Book.includes(:rentals).find(:all, :conditions => ['"rentals"."return_date" is NULL'])
但我也希望根据我的参数添加一些查询。
我该如何做到这一点?
答案 0 :(得分:1)
joins
方法将与左外连接一起使用,但您需要自己构造SQL片段。下面,演示了这一点,结合了merge
和另外一个租借范围。
class Rental < ActiveRecord::Base
scope :no_return, where('return_date IS NULL')
end
join_statement = 'LEFT OUTER JOIN rentals ON rentals.book_id = books.id'
Book.joins(join_statement).merge(Rental.no_return)
# => returns set of books with no rentals and
# books with rentals that have no return date
在一个不相关的说明中,你会发现许多人更喜欢这样写pending?
方法:
def pending?
return_date.nil?
end
答案 1 :(得分:0)
您应该使用joins
:
Book.joins('LEFT OUTER JOIN rentals ON books.id = rentals.book_id')
.where('rentals.return_date IS NULL')