2015-01-29 2 views
2

Как фильтровать массив Ruby для объектов, которые соответствуют любому из нескольких критериев?Фильтровать массив Ruby объектов для любого из нескольких критериев?

Например, если у меня есть массив сообщений в блоге (каждый с заголовком, содержимым и нолем или более тегами), и у меня есть поисковый запрос «отпуск», как мне вернуть список всех сообщения с заголовком, контентом или тегами, содержащими слово «отпуск»?

Очевидно, что следующий не будет работать:

posts.select do |post| 
    post.title.include? "vacation" 
    post.content.include? "vacation" 
    post.tags.include? "vacation" 
end 
+0

вы знаете (OR) оператор '' ||? – apneadiving

+0

Если вы можете, используйте SQL, если вы не можете, используйте 'post.title.include? "отпуск" || post.content.include? "отпуск" || post.tags.include? "отпуск" ' – MrYoshiji

ответ

0

Вы можете попробовать следующее

posts.select do |post| 
    post.title.include? ("vacation") || post.content.include?("vacation") || post.tags 
    .include?("vacation") 
end 

Это делает использование оператора рубин ||.

+0

Спасибо! Я только пробовал раньше без круглых скобок, что не работает. –

0

Вы могли бы сделать следующее.

Код

def selected_posts(posts, arr, keyword) 
    posts.select { |post| arr.reduce(false) { |present, m| 
    present || post.send(m).include?(keyword) } } 
end 

Пример

class Post 
    attr_reader :title, :content, :tags 
    def initialize(title, content, tags) 
    @title = title 
    @content = content 
    @tags = tags 
    end 
end 

posts = [Post.new("a", "b", "vacation"), 
     Post.new("a", "b", "c"), 
     Post.new("a", "vacation", "vacation")] 

arr = [:title, :content, :tags] 

selected_posts(posts, arr, "vacation") 
    #=> [#<Post:0x007fc87a247da0 @title="a", @content="b", @tags="vacation">, 
    # #<Post:0x007fc87a247a80 @title="a", @content="vacation", @tags="vacation">] 
Смежные вопросы