【问题标题】:search models tagged_with OR title like (with acts_as_taggable_on)搜索模型 tagged_with OR 标题(使用acts_as_taggable_on)
【发布时间】:2011-02-21 03:33:06
【问题描述】:

我正在使用范围搜索模型。这是由带有搜索参数 q 的搜索表单访问的。目前我有下面的代码,可以很好地搜索与模型关联的标签。但我也想搜索标题字段。如果我添加到这个范围,那么我将得到所有结果,其中有一个标签和标题与搜索词匹配。

但是,我需要返回与 company_id 和 category_id 匹配的结果,以及匹配的标题或标签。我不知道如何向这个范围添加 OR 子句。

  def self.get_all_products(company, category = nil, subcategory = nil, q = nil)
    scope = scoped{}
    scope = scope.where "company_id = ?", company
    scope = scope.where "category_id = ?", category unless category.blank?
    scope = scope.tagged_with(q) unless q.blank?
    scope
  end

我正在使用 Rails 3。

【问题讨论】:

  • 你能解释一下你最终做了什么吗?我也在使用acts-as-taggable-on,并希望查询返回与公司名称或与记录关联的任何标签匹配的结果

标签: ruby-on-rails scope acts-as-taggable-on


【解决方案1】:

有没有考虑过 Arel?你可以这样做

t = TableName.arel_table
scope = scope.where(t[:title].eq("BLAH BLAH").or(t[:tag].eq("blah blah")))

否则你可以这样做

scope = scope.where("title = ? OR tag = ", title_value, tag_value)

【讨论】:

  • 这不起作用,因为标签存储在单独的表中,实际上并不属于 OP 要查询的表。
  • 是的,不应该被接受。问题是关于acts_as_taggable,这不起作用……还是我错过了什么?
【解决方案2】:

我可能是错的,但我认为范围不能帮助您构建or 条件。您必须手动编写代码来构建您的 where 子句。也许是这样的......

clause = "company_id=?"
qparams = [company]

unless category.blank?
    clause += " or category_id=?"
    qparams <= category
end

scope.where clause, *qparams

【讨论】:

  • 嗯...认为可能有更简单的方法。谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多