繁体   English   中英

红宝石在轨道上-在合并范围内使用联合

[英]ruby on rails- Using union inside scope

我正在使用Rails 3.0.3。 我有4张桌子。

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属性。 我如何制作一个可以接受一个单词并将其放置在“ sql”中的艺术品范围,并使用以下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';

谢谢!

为时已晚,但这可能对某人有所帮助。 最后,找到了实现这一目标的方法。

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.*")
}  

如果我正确理解您的问题,这很简单。 像下面的东西会工作:

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}')
"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM