Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何仅显示特定字段不为空的Rails记录?_Ruby On Rails - Fatal编程技术网

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,这看起来是可行的,但我已经决定