如何报告用户是否有效搜索?

时间:2014-06-09 19:12:56

标签: ruby-on-rails ruby

如何确定一个模型的属性值是否存在于另一个模型的属性值中?

我正在开发一个应用程序,我希望看看用户的名字是否已显示在报告中。但是,我不知道从哪里开始解决这个问题。我已经在我的应用程序中使用ransack作为搜索功能用于其他目的。我可以使用Ransack来做这件事吗?

我想我需要在我的用户控制器中创建某种方法或帮助器。我的最终目标是根据结果设置某些css类(即查看的复选标记或未见的' x

也许在我的用户控制器中,我会做这样的事情......但是我不认为现在看待它时,was_seen属性是必要的。

def was_seen?
    @user.was_seen = true if Report.search(@user.name) 
end

模型示例(摘录)

User Model
  :name, String
  :was_seen, Boolean


Report Model
  :body, Text

最终目标是做这样的事情。

<% if user.was_seen %>
    <li class="seen"><%= user.name %></li>
<% else %>
    <li><%= user.name %></li>
<% end %>

可能的解决方案

def was_seen?
  @q = Report.search(body_cont: self.name).result 
  return @q.empty? ? false : true
end

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

User.rb

def was_seen?
  Report.all.select { |r| r.body.include? self.name }.length > 0 ? true : false
end

然后,不要忘记ERB中的完整方法名称:

<% if user.was_seen? %>
    <li class="seen"><%= user.name %></li>
<% else %>
    <li><%= user.name %></li>
<% end %>

此方法可能很慢,具体取决于您拥有的报告和用户的数量,因为您必须在数据库中加载所有报告,然后搜索每个文本字段,并为每个用户重复这两个步骤。我没有Jedi技能来加快查询速度,但这应该让你现在继续前进。

答案 1 :(得分:0)

对于此类任务,我建议使用全文搜索引擎,例如Solr。有一个很棒的宝石叫做sunspot,可以从铁轨上与它连接。

Solr能够做的不仅仅是简单的子串搜索,但即使对于像这样的琐碎案例,它也能超级快。