-1

これは私のモデルです:

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'])

しかし、パラメータに基づいて where クエリをいくつか追加したいと考えています。

どうすればこれを達成できますか?

4

2 に答える 2

2

この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
于 2013-04-23T02:33:14.587 に答える
1

使用する必要がありますjoins

Book.joins('LEFT OUTER JOIN rentals ON books.id = rentals.book_id')
    .where('rentals.return_date IS NULL')
于 2013-04-23T00:30:19.337 に答える