2016-08-31 6 views
0

제목과 같이 복잡해 보이지만 실제로는 안됩니다. 나는 API를 위해 Rails를 사용하고 있고 배열을 받아들이는 엔드 포인트를 가지고있다. 모든 레코드를 반환하려면 배열에 속한 요소 중 적어도 하나와 일치하는 레코드를 반환하고 싶습니다.Ruby on Rails - 자식 레코드가 배열의 요소와 일치하는 모든 레코드를 반환하십시오.

예를 들어 내가 블로그를 만들고 있고 게시물과 태그가 있다고 가정 해 보겠습니다. 위의 가상의 예에서 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 

에 다음

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

:

내가 좋아하는 뭔가를 요청할 수 있습니다 , 나는 "News", "Weather"또는 "Life"중 하나에 대한 태그가있는 모든 게시물을 반환하려고합니다.

저는 노드에서 왔고 최근에 레일스와 많은 시간을 보내지 않았습니다. 그러나 이것은 매우 잘 정의 된 Rails/ActiveRecord 방식의 상황과 같습니다.

+0

어떤 종류의 배열입니까? 어떤 데이터베이스를 사용하고 있습니까? – ollpu

+0

저는 Postgres를 사용하고 있습니다. 배열은 Ruby의 String.split() 메소드에 의해 생성 된 배열 유형에 상관없이 사용할 수 있습니다. – jmknoll

+0

그러나 어떤 유형의 배열이 post.tags입니까? Postgres 배열입니까? – ollpu

답변

3

난 당신이 말,라는 모델 PostTagging에 의해 Post에 가입 된 모델 Tag을 가지고 가정합니다. 따라서

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 

, 당신이해야 할 모든 PostTag에 가입하고 그 Tag 모델을 검색하는 것입니다 태그로 모든 게시물을 얻을 :

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

당신은 할 수 있습니다 joins(:tags) 내부에 Posttags의 관계를 지정 했으므로 where은 태그 이름의 배열입니다. 쉬워요!

+0

OP에 따르면, 중간 모델은 없으며 직접적인'has_many'-association입니다. 또한 태그 배열에 일치하는 태그가 여러 개있는 경우 예제에서 동일한 게시물을 여러 번 반환합니다. '.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')