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
因此,要获得带有该标签的所有帖子,您需要做的就是加入 Tag
到 Post
并搜索那个 Tag
模型:
Post.joins(:tags).where(tags: { name: tags })
您可以这样做 joins(:tags)
因为您在 Post
中指定了一个关系,而 where
中的 tags
是一个标签名称数组。轻松愉快!
这从标题听起来有点复杂,但实际上不应该如此。我正在使用 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
因此,要获得带有该标签的所有帖子,您需要做的就是加入 Tag
到 Post
并搜索那个 Tag
模型:
Post.joins(:tags).where(tags: { name: tags })
您可以这样做 joins(:tags)
因为您在 Post
中指定了一个关系,而 where
中的 tags
是一个标签名称数组。轻松愉快!