Ruby on rails 如何仅显示特定字段不为空的Rails记录?
我想我忽略了一些非常简单的事情,但我真的很感激能帮我弄清楚这是什么 在“项目显示”视图中,我将在局部视图中显示关联的(有许多)任务。我只想显示那些特定字段不为空的记录。我的视图代码如下所示Ruby on rails 如何仅显示特定字段不为空的Rails记录?,ruby-on-rails,Ruby On Rails,我想我忽略了一些非常简单的事情,但我真的很感激能帮我弄清楚这是什么 在“项目显示”视图中,我将在局部视图中显示关联的(有许多)任务。我只想显示那些特定字段不为空的记录。我的视图代码如下所示 <% for task in @tasks %> <% unless task.user.notes.empty? %> <tr> <td><%= task.user.name %></td>
<% for task in @tasks %>
<% unless task.user.notes.empty? %>
<tr>
<td><%= task.user.name %></td>
<td><%= task.user.notes %></td>
</tr>
<% end %>
<% end %>
我的模型如下
Project
has_many :tasks
end
Task
belongs_to :project
belongs_to :user
end
User
has_many :tasks
end
我错过了什么?我是否正确地使用了empty?
?或者我应该在控制器中处理这个?我目前在项目展示中有三个部分,都使用相同的任务查询。在性能和/或最佳实践方面,让所有三个部分从同一个控制器查询中获取数据更有意义,还是只针对这种情况使用sperate查询更有意义
感谢您的指点。在控制器中
def show
@tasks = @project.tasks.paginate(
:page => params[:page],
:conditions=>["notes is not ? and notes !=?",nil,'']
)
end
或,不在控制器中
def show
@tasks = @project.tasks.paginate(
:page => params[:page],
:conditions=>["notes is not ? and notes !=?",nil,'']
)
end
编写一个helper方法来抽象它
添加新的帮助器方法
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 %>
在控制器中
def show
@tasks = @project.tasks.paginate(
:page => params[:page],
:conditions=>["notes is not ? and notes !=?",nil,'']
)
end
或,不在控制器中
def show
@tasks = @project.tasks.paginate(
:page => params[:page],
:conditions=>["notes is not ? and notes !=?",nil,'']
)
end
编写一个helper方法来抽象它
添加新的帮助器方法
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 %>
问题在于调用
task.User.notes
时,您的用户
模型未定义
您可以通过使用Rails
中ActiveSupport
提供的#delegate
宏来解决此问题并改进总体设计。例如,在任务
模型中,尝试添加
delegate:notes,:to=>:user,:prefix=>true,:allow\u nil=>true
这将在任务
模型中添加一个任务.user_notes
方法,该方法允许您直接从任务
本身获取用户
的注释。此外,由于我们指定了allow_nil
选项,因此如果没有与任务
关联的用户
,则该方法的结果将是nil
,而不是异常
您还可以为用户
的名称
属性添加此属性,允许您从视图中调用任务.User\u name
资源:
代表
-
- “得墨忒尔定律”——
问题在于调用task.User.notes
时,您的用户
模型未定义
您可以通过使用Rails
中ActiveSupport
提供的#delegate
宏来解决此问题并改进总体设计。例如,在任务
模型中,尝试添加
delegate:notes,:to=>:user,:prefix=>true,:allow\u nil=>true
这将在任务
模型中添加一个任务.user_notes
方法,该方法允许您直接从任务
本身获取用户
的注释。此外,由于我们指定了allow_nil
选项,因此如果没有与任务
关联的用户
,则该方法的结果将是nil
,而不是异常
您还可以为用户
的名称
属性添加此属性,允许您从视图中调用任务.User\u name
资源:
代表
-
- “得墨忒尔定律”——
问题在于,当您调用task.user
时,user
关联为零。检查以确保数据库中的每个任务
都有一个用户id
谢谢carlosramirezii,这确实是个问题。我的一些测试数据有错误。在此基础上,我的方法是最好的方法吗?我知道人们通常说不要把逻辑放在观点中。但是,对于使用同一查询的三个部分,运行单独查询与在视图中执行此操作的优缺点是什么。谢谢你的想法。安迪-我不认为你的观点逻辑太不合理,但我在下面添加了一个新的答案,解释了如何改进你的最佳实践。希望有帮助!问题是调用task.user
时,user
关联为零。检查以确保数据库中的每个任务
都有一个用户id
谢谢carlosramirezii,这确实是个问题。我的一些测试数据有错误。在此基础上,我的方法是最好的方法吗?我知道人们通常说不要把逻辑放在观点中。但是,对于使用同一查询的三个部分,运行单独查询与在视图中执行此操作的优缺点是什么。谢谢你的想法。安迪-我不认为你的观点逻辑太不合理,但我在下面添加了一个新的答案,解释了如何改进你的最佳实践。希望有帮助!谢谢你的回答,泰迪。我真正想知道的是你对在视图与控制器中实现这一点的看法。我知道普通人说不在视图中实现逻辑,但是三个部分使用相同的查询,这似乎是一个特例。在视图中实现这一点,与仅为此运行单独的查询相比,会对性能产生什么影响?谢谢Teddy,这看起来是可行的,但我已决定实施上面的carlosramireziii解决方案。谢谢Teddy提供的有用答案。我真正想知道的是你对在视图与控制器中实现这一点的看法。我知道普通人说不在视图中实现逻辑,但是三个部分使用相同的查询,这似乎是一个特例。在视图中实现这一点,与仅为此运行单独的查询相比,对性能的影响是什么?谢谢Teddy,这看起来是可行的,但我已经决定