I am using rails 3.0.3. I have got 4 tables.
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
All these three tag_tables got a name attribute. how can i make an Artwork scope which accepts a word and puts it in the place of 'Abstract' with the following sql:
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';
Thanks!
Its bit late but this might be helpful for someone. Finally, found the rails way of doing it.
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.*")
}
Its quite simple, if i am correctly understanding your question. Something like below would work :
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}')
"
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.