Ruby on rails 在多个表的属性中创建搜索

Ruby on rails 在多个表的属性中创建搜索,ruby-on-rails,globalize,Ruby On Rails,Globalize,我正在使用添加广告到我的网站 我有一个复杂的问题,我有一个搜索引擎来过滤活动 这是我的两个模型: class Activity < ActiveRecord::Base belongs_to :category translates :name, :description end class Category < ActiveRecord::Base has_many :activities translates :name end 但我的问题是,我想用同一个

我正在使用添加广告到我的网站

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

这是我的两个模型:

class Activity < ActiveRecord::Base
  belongs_to :category

  translates :name, :description
end

class Category < ActiveRecord::Base
  has_many :activities

  translates :name
end
但我的问题是,我想用同一个查询按名称过滤活动和按名称过滤类别,因为我必须输入它们的翻译表,就像活动中的类别是可选的一样

我正在尝试:

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}%")
但这不起作用,只返回有类别的活动

有什么建议吗?

迪克莱默:我从未使用过全球化宝石,所以你的想法可能会有所不同

可以使用两个子选择而不是联接来执行此操作

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)

我只是猜测,在translations表中有一个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}%"))
)
迪克莱默:我从未使用过全球化宝石,所以你的想法可能会有所不同

可以使用两个子选择而不是联接来执行此操作

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)

我只是猜测,在translations表中有一个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}%"))
)

嗯,也许只是做一个子查询而不是加入?或者从category\u translations WHERE category\u translations.name中选择category\u id,比如:query.Hmm,可能只是执行子查询而不是加入?或者在目录中的目录\u id从目录\u翻译中选择目录\u id,目录\u翻译。名称类似:query。