Как отобразить только те записи Rails, где конкретное поле не пустое? - PullRequest
0 голосов
/ 05 марта 2012

Я думаю, что я упускаю из виду кое-что очень простое здесь, но был бы действительно признателен за помощь, чтобы понять, что это такое.

В представлении проекта отображается частичное отображение связанных задач (has_many). Я только хочу отобразить те записи, где определенное поле не является пустым. Мой код вида выглядит следующим образом.

<% for task in @tasks %>
    <% unless task.user.notes.empty? %>
    <tr>
         <td><%= task.user.name %></td>
         <td><%= task.user.notes %></td>
    </tr>
    <% end %>
<% end %>

Это возвращается undefined method 'notes' for nil:NilClass. Это странно, так как: примечания определенно в модели User.

Контроллер проекта, обрабатывающий это, содержит:

def show
    @tasks = @project.tasks.paginate(:page => params[:page])
end

Мои модели выглядят следующим образом

Project
  has_many :tasks
end

Task
  belongs_to :project
  belongs_to :user
end

User
  has_many :tasks
end

Что я здесь пропустил? Я правильно использую empty?? Или я должен обрабатывать это в контроллере? В настоящее время у меня есть три части в шоу Project, все с использованием одного и того же запроса Task. Производительность и / или лучшие практики, имеет ли смысл иметь все три частичных источника данных из одного и того же запроса контроллера или иметь отдельный запрос только для этого случая?

Спасибо за любые указатели.

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Проблема заключалась в том, что ваша модель User была неопределенной, когда вы звонили task.user.notes.

Вы можете решить эту проблему, а также улучшить общий дизайн, используя макрос #delegate, предоставленныйActiveSupport в Rails.Например, внутри модели Task попробуйте добавить

delegate :notes, :to => :user, :prefix => true, :allow_nil => true

Это добавляет метод task.user_notes к модели Task, который позволит вам получить User s notes прямо от самого Task.Кроме того, поскольку мы указали опцию allow_nil, если с Task не связано User, результатом метода будет nil вместо исключения.

Вы также можете добавить это для атрибута name User, позволяющего вам вызывать task.user_name из представления.

Ресурсы:

2 голосов
/ 05 марта 2012

В контроллере

def show
   @tasks = @project.tasks.paginate(
     :page => params[:page],
     :conditions=>["notes is not ? and notes !=?",nil,'']
   )
end

ИЛИ, а не в контроллере

Напишите вспомогательный метод для абстрагирования.

Добавить новый вспомогательный метод

def filter_tasks(tasks)
  tasks.find(
    :all,
    :conditions=>["notes is not ? and notes !=?",nil,'']
  )
end

И использовать помощника в поле зрения

<% for task in filter_tasks(@tasks) %>
  <% unless task.user.notes.empty? %>
    <tr>
      <td><%= task.user.name %></td>
      <td><%= task.user.notes %></td>
    </tr>
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...