【问题标题】:Create a search in the attributes of multiple tables在多个表的属性中创建搜索
【发布时间】:2019-10-14 19:29:18
【问题描述】:

我正在使用globalize gem 向我的网站添加无线电

我有一个复杂的问题,我有一个搜索引擎来过滤活动

这是我的两个模型:

class Activity < ActiveRecord::Base
  belongs_to :category

  translates :name, :description
end

class Category < ActiveRecord::Base
  has_many :activities

  translates :name
end

我用 gem 生成了他们的表,我有 activitiesactivity_translationscategoriescategory_translations

我要翻译的字段(你可以在他们的模型中看到)在他们的翻译表中,如果我想按名称搜索 activitiescategories 我必须在他们的翻译表中搜索它们

对于活动来说,这很容易:

activities = Activity.with_translations.where(event_id: event_id)
activities = activities.where('activity_translations.name LIKE :query', query: "%#{query}%")

但我的问题是我想用相同的查询过滤activities by namecategories by name,因为我必须输入他们的翻译表,就像活动中的类别一样可选

我正在尝试这个:

activities = Activity.with_translations.where(event_id: event_id)
activities = activities
                       .joins("LEFT OUTER JOIN categories ON activities.category_id = categories.id INNER JOIN category_translations ON category_translations.category_id = categories.id")
                       .where('activity_translations.name LIKE :query OR activity_translations.description LIKE :query OR category_translations.name LIKE :query', query: "%#{query}%")

但这不起作用只会返回具有类别的活动

有什么建议吗?

【问题讨论】:

  • 嗯,也许只是做一个子查询而不是加入? OR WHERE category_id IN (SELECT category_id FROM category_translations WHERE category_translations.name LIKE :query).

标签: ruby-on-rails globalize


【解决方案1】:

免责声明:我从未使用过 globalize gem,因此您的里程可能会有所不同。

您可以使用两个子选择而不是连接来做到这一点。

SELECT activities.* FROM activities 
WHERE activities.id IN 
  (SELECT activity_translations.activity_id FROM activity_translations WHERE activity_translations.name LIKE :query)
OR activities.category_id IN 
  (SELECT category_translations.category_id FROM category_translations WHERE category_translations.name LIKE :query)

我只是在这里猜测,翻译表中有一个x_id 列指向回来。

您可以使用以下内容在 vanilla ActiveRecord 中重现该查询:

Activity.where(
  id: ActivityTranslation.select(:activity_id)
        .where('name LIKE ?', "%#{query}%"))
.or(
  Activity.where(
    category_id: CategoryTranslation.select(:activity_id))
       .where('name LIKE ?', "%#{query}%"))
)

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2012-08-02
    • 2014-11-02
    • 2013-01-23
    相关资源
    最近更新 更多