2016-08-30 3 views
1

Arel이 제공하는 or 메소드를 활용하기 위해 다음 레일즈 where 절을 Arel을 사용하여 변환하려고합니다.Rails Arel이 조인 된 테이블의 조인 위치

포스트 모델 I 마크가 게시 한 게시물을 찾고 있어요

class User 
    has_many :posts 
end 

class Post 
    belongs_to :user 
end 

사용자 모델.

은 레일 쿼리입니다 :

Post.joins(:user).where(users: { first_name: 'Mark' }) 

내가 Arel와이 쿼리를 변환해야합니다.

미리 감사드립니다.

답변

4

이렇게해야합니다.

# Generate Arel tables for both 
posts = Arel::Table.new(:posts) 
users = Arel::Table.new(:users) 

# Make a join and add a where clause 
posts.join(:users).on(posts[:user_id].eq(users[:id])).where(users[:first_name].eq('Mark')) 
+0

당신이 도움이 될 확신합니다 ? 나는 이것에 대한 에러를 가지고있다 : # 에 대한 정의되지 않은 메소드'join ' –

+0

@AfsaneFadaei correct,'join'과 같은 메소드는 없다. – dskecse

+0

감사. 나는 대답에 대한 편집을 승인했다 : – kiddorails

0

당신은 단지 어디 부분 Arel 필요한 경우 (하지 않는 조인), 나는이 (액티브 결과를 지배 할 것이다) 더 나은 해결책이 될 것이라고 생각 :

Post.joins(:user).where(User.arel_table[:first_name].eq('Mark')) 
+0

왜 Post.joins (: user) .where ('users.first_name =?', 'Mark')가 더 좋지 않은가? ActiveRecord는 항상 – kiddorails

+0

@kiddorails입니다.이 방법으로'.or'와 Arel이 제공하는 다른 메소드를 사용할 수 있으며, 여전히 Activerecord 결과를 쉽게 처리 할 수 ​​있습니다. – user3033467

+0

나는 일반적으로 그 이점을 알고 있습니다. 이 특정 쿼리에서는 유스 케이스가 필요하지 않습니다. – kiddorails