1

基本上,我有一个带有标记系统的应用程序,当有人搜索标记“badger”时,我希望它返回标记为“badger”、“Badger”和“Badgers”的记录。使用单个标签,我可以这样做来获取记录:

@notes = Tag.find_by_name(params[:tag_name]).notes.order("created_at DESC")

它工作正常。但是,如果我得到多个标签(这仅适用于大小写 - 我还没有弄清楚“s”位):

Tag.find(:all, :conditions => [ "lower(name) = ?", 'badger'])

我不能使用 .notes.order("created_at DESC") 因为有多个结果。所以,问题是.... 1)我这样做的方式是否正确?2) 如果是这样,我如何按顺序恢复所有记录?

非常感谢任何帮助!

4

2 回答 2

3

一种实现方式是:

@notes = []
Tag.find(:all, :conditions => [ "lower(name) = ?", 'badger']).each do |tag|
  @notes << tag.notes
end
@notes.sort_by {|note| note.created_at}

但是您应该知道,这就是所谓的 N + 1 查询,因为它在外部进行一次查询,然后每个结果进行一次查询。这可以通过将第一个查询更改为:

Tag.find(:all, :conditions => [ "lower(name) = ?", 'badger'], :includes => :notes).each do |tag|

如果你使用的是 Rails 3 或更高版本,可以稍微重写一下:

Tag.where("lower(name) = ?", "badger").includes(:notes) do |tag|
于 2012-07-19T20:15:42.923 回答
0

已编辑

首先,获取所有可能的标签名称的数组,复数、单数、小写和大写

tag_name = params[:tag_name].to_s.downcase
possible_tag_names = [tag_name, tag_name.pluralize, tag_name.singularize].uniq
# It's probably faster to search for both lower and capitalized tags than to use the db's `lower` function
possible_tag_names += possible_tag_names.map(&:capitalize)

你在使用标签库吗?我知道有些提供了一种查询多个标签的方法。如果您不使用其中之一,则需要在查询中执行一些手动 SQL 连接(假设您使用的是 MySQL、Postgres 或 SQLite 等关系数据库)。我很乐意为您提供帮助,但我不知道您的架构。

于 2012-07-19T20:17:39.687 回答