2011-04-25 3 views
4
model Post 
    # ActiveRecord associations have tons of options that let 
    # you do just about anything like: 
    has_many :comments 
    has_many :spam_comments, :conditions => ['spammy = ?', true] 

    # In Rails 3, named scopes are ultra-elegant, and let you do things like: 
    scope :with_comments, joins(:comments) 
end 

명명 된 범위와 같이 사용자 지정 연결을 정의하기 위해 AREL 또는 기타 약한 구문을 사용할 수있는 방법이 있습니까?사용자 지정 연결에 AREL을 사용할 수있는 방법이 있습니까?

업데이트는

나는 협회는 항상/대부분 모델 사이의 기본적인 관계를 정의한다 있기 때문에, 어쨌든 협회에 세부 사항의 종류를 넣어 좋은 생각이 아니다 결정했습니다.

답변

3

하나는 댓글에 스팸 범위를 넣어하는 것입니다

model Post 
    has_many :comments 

    scope :with_comments, joins(:comments) 
end 

model Comment 
    scope :spammy, where(:spammy => true) 
end 

는이 책임을 모델에 대하여 조금 청소기를 보인다. 성능 측면에서 볼 때 정확히 동일합니다.

p.comments.spammy.to_sql 
# → SELECT "comments".* FROM "comments" 
# WHERE ("comments".post_id = 2) AND ("comments"."spammy" = "t") 

추가 혜택 : 다른 모든 연결에서 스팸 댓글을받을 수 있습니다.

+0

네, 이걸 보았습니다 ... 두 모델 사이의 관계를 정의하지 않았기 때문에 어쨌든 "연관성"이라고 부르는 것이 좋지 않다고 생각합니다. 성능 측면에서 –

+0

인데 이는 연결을 통해 쿼리를 제한하는 것과 동일한 효과가 있습니까? (여기 초급) – noli

2

글쎄, 더 나은 방법이있을 수 있지만 Arel의 to_sql 기능을 사용하여 연결에서 실제 Arel 조건 (ActiveRecord::Relation 초와 반대)을 사용할 수 있다는 것을 알고 있습니다.

has_many :spam_comments, :class_name => 'Comment', :conditions => Comment.arel_table[:spammy].eq(true).to_sql 

실제 Arel 코드는 ActiveRecord 관계만큼이나 가늘다는 것을 알 수 있습니다.

Arel 조건부를 조건으로 전달하는 레일스 마스터 브랜치에 a comment이 있지만 그 코드가 3.0 브랜치에없는 것 같습니다. 적어도 내가 찾을 수있는 것은 아닙니다. 솔루션의