这听起来有点复杂,但它真的不应该。我使用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)
,因为您在Post
和tags
中指定了一个关系,而where
是一个标记名称数组。非常简单!
Post.where(tags: tags) =>
SELECT `posts`.*
FROM `posts`
WHERE `posts`.`tags`
IN ('News', 'Weather', 'Life')