1

我正在使用 Ruby on Rails(版本 3.2.2)和 mysql2(版本 0.3.11 - MySQL 版本 5.2.38)。在讨论“如何通过关联表检索一组用户“共同”拥有的关联对象/记录时*我发现自己处于必须找到“关联对象/记录”的“特定”情况**通过在关联数据库表上运行单个(出于性能原因)SQL 查询。特别是,我想这样做是为了检索前面提到的“关联对象/记录”,其中user_id(表示foreign key“指向”User对象)article_id(表示foreign key“指向”Article列值是相同的(即,在哪里article_iduser_id是“共同的”)。

在我的情况下,我如何/应该检索“关联对象/记录”(也许,通过使用 Ruby on Rails 和/或 SQL/数据库“方式”/“上下文”中的某些工具)?


* 具体来说,在@Andrew Marshall发布他/她的答案之后。

**注意:那些“关联对象/记录”与链接问题中描述的has_many :throughRuby on Rails相关。ActiveRecord::Associations

4

1 回答 1

0

我认为这是一种提取所需内容的原始 sql 方式:

select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id = 2;

您可以在哪里替换 Rails 中的用户 ID:

ArticlesUser.find_by_sql(["select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = ?) and user_id = ?", @user1.id, @user2.id])

或者对于多个 id::

ArticlesUser.find_by_sql(["select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = ?) and user_id IN (?)", @user1.id, [@user2.id,@user3.id]])

所以从样本数据(来自你的其他问题):

mysql> select * from articles_users;
+----+---------+------------+
| id | user_id | article_id |
+----+---------+------------+
|  1 |       1 |          1 |
|  2 |       1 |          2 |
|  3 |       1 |          3 |
|  4 |       2 |          1 |
|  5 |       2 |          2 |
|  6 |       3 |          1 |
|  7 |       3 |          3 |
|  8 |       4 |          4 |
+----+---------+------------+
8 rows in set (0.00 sec)

它将因此返回值:

mysql> select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id = 2;
+----+---------+------------+
| id | user_id | article_id |
+----+---------+------------+
|  4 |       2 |          1 |
|  5 |       2 |          2 |
+----+---------+------------+
2 rows in set (0.00 sec)

mysql> select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id = 3;
+----+---------+------------+
| id | user_id | article_id |
+----+---------+------------+
|  6 |       3 |          1 |
|  7 |       3 |          3 |
+----+---------+------------+
2 rows in set (0.00 sec)

或者对于多个用户 ID:

mysql> select * from articles_users where article_id in (select articles.id from articles inner join articles_users on articles_users.article_id = articles.id where user_id = 1) and user_id in (2,3);
+----+---------+------------+
| id | user_id | article_id |
+----+---------+------------+
|  4 |       2 |          1 |
|  5 |       2 |          2 |
|  6 |       3 |          1 |
|  7 |       3 |          3 |
+----+---------+------------+
4 rows in set (0.00 sec)

您已经要求使用 sql 方式 - 但几乎可以肯定有一种 Railsy 方式可以做到这一点......但这应该让您开始,您可以从这里重构它。

于 2012-09-07T06:28:13.313 回答