app/models/book.rb

Summary

Maintainability
A
0 mins
Test Coverage
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