首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails中跨多个表进行查询

在Rails中跨多个表进行查询
EN

Stack Overflow用户
提问于 2015-08-24 21:35:48
回答 1查看 37关注 0票数 0

我在MySQL数据库中有四个表。蛋白质,末端修饰,名词和Kws。Kw_id是终端修改表中的外键。terminusmodifications_id是Nterms表中的foreign_key。protein_id是Nterms表上的外键,它对应于蛋白质表。

我有一个用户输入了kw_id。这应该可以给我一个Terminusmodifications_id,然后我可以在Nterms表上使用它。使用Nterms表,我可以识别一个protein_id,我可以使用它来查询蛋白质表。我想使用这个查询来提取我已经得到的蛋白质表,如下所示:

代码语言:javascript
复制
@protein = Protein.joins(:searchnames).where("searchnames.name LIKE ?", "%#{params[:query]}%")

所以我在想:

代码语言:javascript
复制
@protein = @protein.joins(:nterms)....

一些类似的东西,但我对语法不熟悉。我正在使用Rails 4.2和Ruby2.0.0

以下是表的样子:

代码语言:javascript
复制
Proteins:
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| ac              | varchar(255) | YES  | UNI | NULL    |                |
| name            | varchar(255) | YES  | UNI | NULL    |                |
| molecular_type  | int(11)      | YES  |     | NULL    |                |
| entry_type      | varchar(255) | YES  |     | NULL    |                |
| dt_create       | varchar(255) | YES  |     | NULL    |                |
| dt_sequence     | varchar(255) | YES  |     | NULL    |                |
| dt_annotation   | varchar(255) | YES  |     | NULL    |                |
| definition      | varchar(255) | YES  |     | NULL    |                |
| sequence        | text         | YES  |     | NULL    |                |
| mw              | int(11)      | YES  |     | NULL    |                |
| crc64           | varchar(255) | YES  |     | NULL    |                |
| aalen           | int(11)      | YES  |     | NULL    |                |
| created_at      | datetime     | YES  |     | NULL    |                |
| updated_at      | datetime     | YES  |     | NULL    |                |
| status          | varchar(255) | YES  |     | unknown |                |
| data_class      | varchar(255) | YES  |     | NULL    |                |
| chromosome      | varchar(255) | YES  | MUL | NULL    |                |
| band            | varchar(255) | YES  | MUL | NULL    |                |
| species_id      | int(11)      | YES  | MUL | NULL    |                |
| meropsfamily    | varchar(255) | YES  | MUL | NULL    |                |
| meropssubfamily | varchar(255) | YES  | MUL | NULL    |                |
| meropscode      | varchar(255) | YES  | MUL | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
Nterms:
+-------------------------+--------------+------+-----+---------+----------------+
| Field                   | Type         | Null | Key | Default | Extra          |
+-------------------------+--------------+------+-----+---------+----------------+
| id                      | int(11)      | NO   | PRI | NULL    | auto_increment |
| protein_id              | int(11)      | YES  | MUL | NULL    |                |
| pos                     | int(11)      | YES  |     | NULL    |                |
| created_at              | datetime     | YES  |     | NULL    |                |
| updated_at              | datetime     | YES  |     | NULL    |                |
| import_id               | int(11)      | YES  | MUL | NULL    |                |
| idstring                | varchar(255) | YES  |     | NULL    |                |
| isoform_id              | int(11)      | YES  | MUL | NULL    |                |
| terminusmodification_id | int(11)      | YES  | MUL | NULL    |                |
| seqexcerpt              | varchar(255) | YES  | MUL | NULL    |                |
+-------------------------+--------------+------+-----+---------+----------------+

Terminusmodifcations:
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  | MUL | NULL    |                |
| description | text         | YES  |     | NULL    |                |
| created_at  | datetime     | YES  |     | NULL    |                |
| updated_at  | datetime     | YES  |     | NULL    |                |
| nterm       | tinyint(1)   | YES  |     | 0       |                |
| cterm       | tinyint(1)   | YES  |     | 0       |                |
| subcell     | varchar(255) | YES  |     | NULL    |                |
| psimodid    | varchar(255) | YES  |     | NULL    |                |
| display     | tinyint(1)   | YES  |     | 1       |                |
| kw_id       | int(11)      | YES  | MUL | NULL    |                |
| ac          | varchar(255) | YES  | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

Kws:
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  | MUL | NULL    |                |
| ac          | varchar(255) | YES  | MUL | NULL    |                |
| description | text         | YES  |     | NULL    |                |
| category    | varchar(255) | YES  | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

模式之间的联系:

蛋白质模型:

代码语言:javascript
复制
  has_many :nterms, -> { uniq }

名词模型:

代码语言:javascript
复制
  belongs_to :protein

  belongs_to :terminusmodification

终端修改模型:

代码语言:javascript
复制
  has_many :nterms
  belongs_to :kw

kw模型:

代码语言:javascript
复制
  has_and_belongs_to_many :proteins
  has_many :terminusmodifications

解决方案发现

代码语言:javascript
复制
@protein = @protein.joins(:nterms => {:terminusmodification => :kw}, :cterms => {:terminusmodification => :kw}).where("kws.name = ?", params[:modifications])
EN

回答 1

Stack Overflow用户

发布于 2015-08-24 23:40:51

您可以使用has_many through:获取关联的关联。

Kw型号:

代码语言:javascript
复制
has_many :nterms, through: :terminusmodification
has_many :proteins, through: :nterms

然后,您应该能够通过以下方式获取与Kw相关的所有蛋白质:

代码语言:javascript
复制
@kw.proteins
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32192132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档