2016-08-31 32 views
0

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

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

我可能要求是这样的:

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 

在假设的例子以上, 一世想要返回所有包含“新闻”,“天气”或“生活”标签的帖子。

我来自节点,最近没有花费太多时间在Rails上。但是这种感觉就像是有一种非常明确的Rails/ActiveRecord方法来实现这一点。

+0

它是一种什么样的数组?你使用的是哪个数据库? – ollpu

+0

我使用的是Postgres,而数组就是Ruby的String.split()方法生成的任何类型的数组。 – jmknoll

+0

但是什么类型的数组是post.tags?它是一个Postgres数组吗? – ollpu

回答

3

我假设你有一个模型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)因为你在Posttags里面指定了一个关系where是一个标签名称数组。十分简单!

+0

根据OP,没有中间模型,它是一个直接'has_many'关联。另外,如果您的示例在tags-array中有多个匹配的标签,它将多次返回相同的帖子。 '.distinct'应该照顾这个。 – ollpu

+0

我找不到OP状态,他没有中间模型,但是如果他不那么pankaj答案会工作得很好:) – shlajin

+0

不,pankaj的答案只能检查帖子的单个“标签”属性。 – ollpu

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