从两个表返回的数据集返回过滤记录
问题描述:
我有三个表:
- 地点
- 空间(属于馆)
- 包括空间(归属于空间)
从两个表返回的数据集返回过滤记录
我收到路线中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包括的空间?
答
我的数据库架构。
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')
我想我可能会问我的问题不对,但您的包含空间没有belongs_to和空格字段。它看起来好像你假设包含空间不是空间,它们是。包含的空间更多地是空间具有父母的参考。额外的皱纹是,空间表和包含空间都没有我可以使用的主键,所以我将不得不加入外键。 – csakon
不,我声明了belongs_to和has_many的层次结构:''场地'有很多'空间','空间'也有很多'包含空间','包含空间'属于'空间'和'空间'也属于一个'场地'。也许你认为这种方式是因为你在表格描述中没有看到FK约束,那是因为我通过padrino生成器创建了它们,我认为他们没有实现通过迁移创建外键的功能。然而,如果宣布FK,唯一更快的查询将是唯一的变化。顺便说一句,如果你添加表结构将会很好。 – marmeladze