2013-06-03 61 views
1

我有一個YAML文件books.yaml如何搜索YAML文件?

- !ruby.object:Book 
    title: Ruby for Newbz 
    author: LeeRoy Jenkins 
    category: Educational 

我已經有了,增加了書這個文件的方法,但我需要一個可以使用正則表達式搜索YAML文件的方法。如果沒有書匹配標題,則應該引發例外NoBookfound。如果有任何匹配,該列表應該返回給調用者。

這裏是我現有的代碼:

require 'yaml' 
require './book' 
class Library 
    attr_accessor :books 

    def initialize file_name = false 
    @books = file_name ? YAML::load(File.read(file_name)) : [] 

    end 

    def add_book(book) 
    @books.push(book) 

    end 

    def search_library(file_name , book) 
    if 
     YAML::load(File.read(file_name)).include?(book) == false 
     raise 'No Book Found' 
    end 
    end 

end 

這是我試過的例外部分,但是我覺得我的路要走。我對Ruby真的很陌生,這似乎是一個相當艱鉅的任務。有沒有人有任何想法?

回答

0

你需要的是從加載的對象測試類:

book = YAML::load(File.read(file_name)) 
raise 'No Book Found' unless book.kind_of? Book 

也有一些kind_of?的替代品,你可以閱讀有關的差異這個nice question

0

根據您的文章,我猜這本書參數是一個正則表達式對象。 我想你應該從search方法中刪除file_name參數,因爲這個文件已經在initialize方法上加載了。

我implemetation是:

def search_library term 
    @books.find_all {|b| b.title =~ term} 
end 
+0

事實上,'file_name'指YAML文件並沒有,只是初始化三個描述'@ title''@ author'一個單獨的書類和'@ category' –

+0

是的,我知道了,但如果您加載文件兩次,我認爲這有點令人困惑。不要提,你將失去所有來自add_book方法的對象。如果你想保留file_name,我認爲這樣做會更好,如果你使這個方法是靜態的:def self.search_library(file_name,term)... –

+0

我明白你在說什麼,我的老師也指出了這一點。謝謝您的幫助! –

0

既然你已經有了「@books」在枚舉您可以使用select method找書,其標題有搜索詞作爲一個子字符串。

def search_library(term) 
    matches = @books.select { |x| x.title.index(term) } 
    raise "No books have title like '#{term}'" if matches.empty? 
    matches 
end 
+0

這似乎工作得很好,謝謝大家誰回覆您的意見! –

+0

@HubertWolski:隨時提出你認爲有幫助的答案,並選擇一個作爲「正確」(或最好的,或你最喜歡的)答案。 – maerics

+0

不能直到我有更好的代表否則我會:) –