2015-05-05 113 views
0

使用此宝石:http://filterrific.clearcove.ca/我已成功在我的应用程序上设置搜索。这是使用的范围。使我的导轨应用程序不区分大小写

scope :search_by_name, ->(name){ where(name: name) } 

可以说有一个名字叫'Jonathon',而你寻找'jon'我希望它能带来这个结果。此外,现在如果您搜索'jonathon'(将J更改为j),则不会显示结果。您必须完全按照条目进行。

+0

假设您的DB区分大小写(如postgresql),如果您查看链接网站中的文档(http://filterrific.clearcove.ca/pages/active_record_scope_patterns.html#search),您将看到它们如何展示如何通过使用'LOWER'搜索并降低搜索条件 – Doon

回答

0

要在数据库之间保持可移植性,请考虑将范围更改为命名方法并使用AREL匹配。

def search_by_name(name) 
    where(arel_table[:name].matches(name)) 
end 

虽然也许范围可以工作:

​​

由于命名的范围是相同的方法,尤其是当你传递一个λ变量,有没有它的缺点是一个方法而不是范围。

您可能需要预先设置或追加一个%(或两者)名称参数为它寻找包含参数(而不是仅仅精确区分大小写的匹配。因此,也许什么...

def search_by_name(name) 
    where(arel_table[:name].matches('%' + name + '%')) 
end 
+0

这个问题解决了我的大小写问题,我应该在哪里放置'def'?该项目的控制器被过滤?提前对不起我的新手h方式:) – jhammond2012

+0

不用担心。它应该与您的范围相同,可以在控制器内进行呼叫。您应该避免将此方法放入控制器中,因为您通常需要瘦控制器(以及如此胖的模型),但更多的原因是关于模型的事情应该与模型保持一致。 – rdnewman

+0

另外,为了清楚起见,如果修改的作用域版本工作,您不需要'def'方法。方法形式是替代方案,而不是另外。 – rdnewman