2012-11-17 5 views
1

레일 3.0.3을 사용하고 있습니다. 나는 4 개의 테이블을 가지고있다.ruby ​​on rails- 범위 내에서 공용체 사용

class Artwork 
    has_and_belongs_to_many :tag_styles 
    has_and_belongs_to_many :tag_subjects 
    has_and_belongs_to_many :tag_arttypes 
end 

class TagArttype 
    set_table_name :tag_arttypes 
    has_and_belongs_to_many :artworks 
end 

class TagStyle 
    set_table_name :tag_styles 
    has_and_belongs_to_many :artworks 
end 

class TagSubject 
    set_table_name :tag_subjects 
    has_and_belongs_to_many :artworks 
end 

이 세 가지 tag_tables에는 모두 name 속성이 있습니다.

select a.* from artworks as a, tag_arttypes as ta, artworks_tag_arttypes as ata where a.id = ata.artwork_id and ta.id = ata.tag_arttype_id and ta.name = 'Abstract' union 
select a.* from artworks as a,tag_styles as ta,artworks_tag_styles as ata where a.id = ata.artwork_id and ta.id = ata.tag_style_id and ta.name = 'Abstract'union 
select a.* from artworks as a,tag_subjects as ta,artworks_tag_subjects as ata where a.id = ata.artwork_id and ta.id = ata.tag_subject_id and ta.name = 'Abstract'; 

감사 : 어떻게 단어를 받아 다음과 같은 SQL을 '추상'의 위치에두고 작품의 범위를 만들 수 있습니다!

답변

1

조금 늦었지만 다른 사람에게 도움이됩니다. 마지막으로 레일을 사용하는 방법을 찾았습니다.

scope :by_tags, lambda { |tag| 
    includes(:tag_styles,:tag_subjects,:tag_arttypes).where('tag_styles.name LIKE ? OR tag_arttypes.name LIKE ? OR tag_subjects.name LIKE ?',"%#{tag}","%#{tag}","%#{tag}"). 
select("DISTINCT artworks.*") 
} 
0

귀하의 질문을 올바르게 이해하고 있다면 매우 간단합니다. 다음과 같이 작동합니다.

scope :filter, lambda {|name| 
" 
(select a.* from artworks as a, tag_arttypes as ta, artworks_tag_arttypes as ata where a.id = ata.artwork_id and ta.id = ata.tag_arttype_id and ta.name = '#{name}') union 
(select a.* from artworks as a,tag_styles as ta,artworks_tag_styles as ata where a.id = ata.artwork_id and ta.id = ata.tag_style_id and ta.name = '#{name}') union 
(select a.* from artworks as a,tag_subjects as ta,artworks_tag_subjects as ata where a.id = ata.artwork_id and ta.id = ata.tag_subject_id and ta.name = '#{name}') 
" 
}