我有三个具有以下字段的模型(# 之后的每个字段):
class User < ApplicationRecord
has_many :user_tags, dependent: :destroy
end
class UserTag < ApplicationRecord
belongs_to :user
end
class JourneyTag < ApplicationRecord
belongs_to :journey
end
我想找到所有带有对应于用户标签的标签的旅程 - user.user_tags
。如何获取这些数据?
我想做的是:
current_user.user_tags.each do |user_tag|
JourneyTag.where(cms_tag_id: user_tag.cms_tag_id)
end
这应该给我 JourneyTag 与 user.user_tags
具有相同的 cms_tag_id
然后我想捕获 JourneyTag
的集合来找到旅行。但是上面的查询是没有用的,因为它总是返回一些 JourneyTag,即使它不匹配 user_tag.cms_tag_id
最佳答案
尝试:
Journey.joins(:journey_tags).where(journey_tags: { cms_tag_id: current_user.user_tags.pluck(:cms_tag_id) })
分解:
current_user.user_tags #=> returns all user tag ids associated
current_user.user_tags.pluck(:cms_tag_id) #=> gives all associated cms_tag_id in single SELECT `cms_tag_id` query
journey_tags: { cms_tag_id: current_user.user_tags.select(:cms_tag_id) } #=> executes matching WHERE against JourneyTags
Journey.joins(:journey_tags) #=> filtered JourneyTags joins with Journey
或者,您可以尝试以下手动连接:
Journey.joins(:journey_tags).joins('INNER JOIN user_tags on user_tags.cms_tag_id = journey_tags.cms_tag_id INNER JOIN users on user_tags.user_id = users.id')
关于sql - 用于获取用户关联数据的 Rails 或 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63257290/