2017-04-26 136 views
0

我有三个表:
- 地点
- 空间(属于馆)
- 包括空间(归属于空间)
从两个表返回的数据集返回过滤记录

我收到路线中Venue的id并返回我知道的所有相关空间都包含Spaces(空间记录中的一个名为num_included_spaces__c的字段,用于维护其子项的计数)。现在,我拥有该场所的所有相关父空间,我需要为它们查找所有包含空格。

一个包含的空间仍然是一个空间,它恰好有一个驻留在同一个表中的父项。我试图把这个:

地点= Rockdog
- 空间=楼上
- 空间=媒体室
- 空间=庭院
- 空间=楼下
- 空间=前天井
- 空间=室内酒吧

进入这个:

地点= Rockdog
- 空间= Upsta IRS
- 包括空间=媒体室
- 包括空间=庭院
- 空间=楼下
- 包括空间=前天井
- 包括空间=室内酒吧

的包括的空格表具有belongs_to__c和space__c作为字段,其中belongs_to__c是父空间的ID,space__c是子级的ID。所以我希望找到的所有地方belongs_to_c匹配任何@spaces的ID回以下

@sub_spaces = Space.where("venue__c = ? AND num_included_spaces__c = ?", params[:venue],0) 

@spaces = Space.where("venue__c = ? AND num_included_spaces__c > ?", params[:venue],0) 

我怎么会写这个活动记录查询的@included_spaces包括的空间?

回答

0

我的数据库架构。

mysql> describe venues; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | YES |  | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
4 rows in set (0,00 sec) 

mysql> describe spaces;; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | YES |  | NULL |    | 
| venue_id | int(11)  | YES |  | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
5 rows in set (0,00 sec) 

ERROR: 
No query specified 

mysql> describe included_spaces;; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | YES |  | NULL |    | 
| space_id | int(11)  | YES |  | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
5 rows in set (0,00 sec) 

ERROR: 
No query specified 

以下功能会以某种方式给你你需要(在控制台ofcourse),但是这不是一个很好的解决方案的结果 - 它查询数据库所需以上。然而,它是最简单的 - ))

def foo id 
    v = Venue.find(id) 
    puts v.name 
    v.spaces.each do |space| 
     puts space.name 
     space.included_spaces.each do |spis| 
     puts spis.name 
     end 
    end 
end 

您也可以尝试更复杂的查询某事像,

mysql> SELECT spaces.name, included_spaces.name FROM `spaces` INNER JOIN `venues` ON `venues`.`id` = `spaces`.`venue_id` INNER JOIN `included_spaces` ON `included_spaces`.`space_id` = `spaces`.`id` WHERE `spaces`.`venue_id` = 1 
    -> ; 
+------------+-----------+ 
| name  | name  | 
+------------+-----------+ 
| Upstairs, | Front  | 
| Upstairs, | Patio, | 
| Upstairs, | Indoor | 
| Upstairs, | Bar  | 
| Downstairs | Media  | 
| Downstairs | Room,  | 
| Downstairs | Courtyard | 
+------------+-----------+ 
7 rows in set (0,00 sec) 

应翻译为活动记录为

Space.joins(:venue) 
    .joins(:included_spaces) 
    .where(venue_id: 1) 
    .select('spaces.name, included_spaces.name') 
+0

我想我可能会问我的问题不对,但您的包含空间没有belongs_to和空格字段。它看起来好像你假设包含空间不是空间,它们是。包含的空间更多地是空间具有父母的参考。额外的皱纹是,空间表和包含空间都没有我可以使用的主键,所以我将不得不加入外键。 – csakon

+0

不,我声明了belongs_to和has_many的层次结构:''场地'有很多'空间','空间'也有很多'包含空间','包含空间'属于'空间'和'空间'也属于一个'场地'。也许你认为这种方式是因为你在表格描述中没有看到FK约束,那是因为我通过padrino生成器创建了它们,我认为他们没有实现通过迁移创建外键的功能。然而,如果宣布FK,唯一更快的查询将是唯一的变化。顺便说一句,如果你添加表结构将会很好。 – marmeladze