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。