返回所有子记录匹配数组元素的记录



这听起来有点复杂,但它真的不应该。我使用Rails作为API,并且有一个端点接受一组项目。我想返回所有属于它的记录匹配数组中至少一个元素的记录。

例如,假设我正在创建一个博客,并且我有Posts和Tags。

我可能会请求如下内容:

GET http://localhost:3000/api/v1/posts_by_tag?tags=news,weather,life
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

在上面的假设示例中,我希望返回所有带有"新闻"、"天气"或"生活"标签的帖子。

我来自node,最近没有花太多时间在Rails上。但这感觉像是有一个非常明确的Rails/ActiveRecord方法来做这件事。

我假设您有一个模型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

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

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

您可以这样做joins(:tags),因为您在Posttags中指定了一个关系,而where是一个标记名称数组。非常简单!

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

最新更新