Ruby on Rails - Return 所有记录,其中 child 记录匹配数组中的元素

Ruby on Rails - Return all records where child record matches element in an array

这从标题听起来有点复杂,但实际上不应该如此。我正在使用 Rails 作为 API,并且有一个接受项目数组的端点。我想要 return 所有记录,其中属于它的记录至少与数组中的一个元素匹配。

例如,假设我正在创建一个博客,并且我有帖子和标签。

我可能会要求这样的东西:

GET http://localhost:3000/api/v1/posts_by_tag?tags=news,weather,life

然后在routes.rb

get '/posts_by_tag' => 'posts#index_by_tag'

并在 posts_controller.rb

def index_by_tag
  tags =  params[:tags].split(',')
  @posts = Post.where( any element in Post.tags matches any element in tags )
  render json: @posts.to_json, status: :ok
end

在上面的假设示例中,我想 return 所有具有 "News"、"Weather" 或 "Life" 标签的帖子。

我来自 node,最近没有花太多时间在 Rails 上。但这感觉就像是一种非常 well-defined Rails/ActiveRecord 的方法。

Post.where(tags: tags) => 
  SELECT `posts`.* 
  FROM `posts` 
  WHERE `posts`.`tags` 
  IN ('News', 'Weather', 'Life')

我假设您有一个模型 Tag,它通过一个名为 PostTagging.

的模型连接到 Post
class PostTagging < ActiveRecord::Base
  belongs_to :post
  belongs_to :tag
end

class Post < ActiveRecord::Base
  has_many :post_taggings
  has_many :tags, through: :post_taggings
end

因此,要获得带有该标签的所有帖子,您需要做的就是加入 TagPost 并搜索那个 Tag 模型:

Post.joins(:tags).where(tags: { name: tags })

您可以这样做 joins(:tags) 因为您在 Post 中指定了一个关系,而 where 中的 tags 是一个标签名称数组。轻松愉快!