Rails 3 - перебрать, чтобы получить коллекцию? - PullRequest
1 голос
/ 11 марта 2011

Я использую поиск, и у меня возникли некоторые трудности с моим sql / find.

По сути, у меня есть страница избранного, которая получает коллекцию избранного с:

@favorites = current_user.votes

В представлении я затем перебираю список избранных и могу вызывать .voteable для них, чтобы получить реальный объект, за который проголосовали.Это делает поиск очень трудным для меня, чтобы писать.

Мне было интересно, можно ли было изменить мою первоначальную коллекцию, так что я на самом деле получаю .voteable объекты каждый раз, чтобы высушить мой взгляд / помощьмне написать мой поиск.Я не могу вызвать current_user.votes.voteables, но по отдельности могу сделать что-то вроде current_user.votes.first.voteable

То, что я пытался сделать, - это такой цикл:

@favorites = current_user.votes.each {|vote| vote.voteable }

Что не таки я просто снова получаю свои голоса, а не фактический объект для голосования.Мне было просто интересно, есть ли способ заставить эти бюллетени для голосования пройтись по моим голосам вот так.

Любые указатели помогут, спасибо.

РЕДАКТИРОВАТЬ:

Расширение, чтоЯ имею в виду под поиском:

Я строю метод в модели, которая ищет себя, вот пример:

def self.search(search)
    if search
      where('title LIKE ?', "%#{search}%")
    else
      scoped
    end
  end 

Я передаю в поиске из вида с формой, подобной:

<div id="search_form">
    <%= form_tag topic_links_path, :method => 'get', :id => "links_search" do %>
      <%= text_field_tag :search, params[:search], :size => "35"  %>
      <%= submit_tag "Search", :name => nil %>
    <% end %>
  </div>  

Таким образом, когда я делаю свою коллекцию в контроллере, я могу вызвать .search (params [: search]), чтобы получить только те элементы, которые похожи на то, что пользователь ввел в форму.Я использую камень voice_fu для обработки голосов и голосов.

1 Ответ

3 голосов
/ 11 марта 2011

Вам нужно использовать map вместо each:

@favorites = current_user.votes.map {|vote| vote.voteable }

each просто циклически перебирает элементы и выполняет над ними операцию, но не возвращает результат вформат массива.Это то, что делает map.

В примечании вы можете использовать область поиска вместо функции.Это может быть немного чище:

scope :search, lambda{ |title| where('title LIKE ?', "%#{title}%") unless title.blank? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...