我有 2 个模型 - 餐厅和特色。它们通过 has_and_belongs_to_many 关系连接。它的要点是您的餐厅具有许多功能,例如外卖、比萨饼、三明治、沙拉吧、素食选项……所以现在当用户想要过滤餐厅并假设他检查比萨饼和外卖时,我想显示所有兼具这两种功能的餐厅;比萨饼,送货,也许还有更多,但它必须有比萨饼和送货。
如果我做一个简单.where('features IN (?)', params[:features])
的,我(当然)会得到那些有的餐厅——所以或披萨或送货或两者兼有——这根本不是我想要的。
我的 SQL/Rails 知识有点有限,因为我是新手,但我问了一个朋友,现在我有了这个可以完成工作的 huuuge SQL:
Restaurant.find_by_sql(['SELECT restaurant_id FROM (
SELECT features_restaurants.*, ROW_NUMBER() OVER(PARTITION BY restaurants.id ORDER BY features.id) AS rn FROM restaurants
JOIN features_restaurants ON restaurants.id = features_restaurants.restaurant_id
JOIN features ON features_restaurants.feature_id = features.id
WHERE features.id in (?)
) t
WHERE rn = ?', params[:features], params[:features].count])
所以我的问题是:有没有更好的 - 甚至更多的 Rails - 这样做的方式?你会怎么做?
哦,顺便说一句,我在 Heroku 上使用 Rails 4,所以它是一个 Postgres DB。