app/models/book.rb
class Book < ActiveRecord::Base
attr_accessible :author, :image, :isbn, :name, :id, :publisher, :price, :sub_title,
:pages, :image_large, :translators, :publish_date, :sort_id
validates_presence_of :image, :isbn, :name, message: 'cannot be blank.'
validates_uniqueness_of :isbn, :image, message: 'should be unique.'
has_many :book_instances
has_many :users, through: :book_instances
acts_as_commentable
def current_borrowers
borrowers = []
book_instances.each { |instance|
if instance.borrowed?
borrowers << instance.current_borrower
end
}
borrowers
end
def total_borrowers
borrowers = []
book_instances.each { |instance|
unless instance.borrowers.empty?
borrowers += instance.borrowers
end
}
borrowers
end
def available_instance
avail_instance = nil
book_instances.each do |instance|
unless instance.borrowed?
avail_instance = instance
break
end
end
avail_instance
end
def total_available_instances
instances = []
book_instances.each { |instance|
instances << instance if instance.public && !instance.borrowed?
}
instances
end
def new_instance_for(user)
book_instances.create user_id: user.id, book_id: id
end
def self.create_book_by_isbn(book_info)
Book.create name: book_info['title'],
image: book_info['image'],
isbn: book_info['isbn13'],
author: book_info['author'][0],
publisher: book_info['publisher'],
price: book_info['price'],
sub_title: book_info['subtitle'],
pages: book_info['pages'],
image_large: book_info['images']['large'],
publish_date: book_info['pubdate']
end
def self.fetch_book_info_from_douban(isbn)
http = Net::HTTP.new('api.douban.com', 443)
http.use_ssl = true
path ='/v2/book/isbn/' + isbn
response = http.get(path)
book_info = JSON.parse response.body
if book_info['code'] == 6000
book_info
else
self.create_book_by_isbn book_info
end
end
def self.find_book(isbn)
book = Book.find_by_isbn isbn
book ? book : Book.fetch_book_info_from_douban(isbn)
end
def open_owners
total_available_instances.map { |instance| instance.user }
end
end