好的,假设我有三个表如下:
t1 t2 t3
--- --- ---
id t3_id id
name t1_id name
value
导轨模型如下:
t1 t2 t3
---- ------ --------
has_many :t2s belongs_to :t1 has_many :t2s
belongs_to :t3
我想为来自 t2 的 t2 中的每个 t3.name 提供一个行列表 t1. 因此,如果我们有以下内容:
t1 t2 t3
+----+------+ +------+------+-----+ +----+-------+
| id | name | |t3_id | t1_id|value| | id | name |
+----+------+ +------+------+-----+ +----+-------+
| 1 | row1 | | 1 | 1 | a | | 1 | alpha |
+----+------+ +------+------+-----+ +----+-------+
| 2 | row2 | | 2 | beta |
+----+------+ +----+-------+
对于阿尔法,我想要
t3.name t1.name
------- -------
alpha row2
对于测试版,我想要:
t3.name t1.name
------- -------
beta row1
beta row2
如何使用活动记录方法执行此操作?
更新
我得到了将获得我想要的结果的 SQL,但不确定如何将其放入活动记录中。
该 SQL 是
SELECT T1.name FROM T1 LEFT JOIN
(SELECT T2.t1_id FROM T3 JOIN T2 ON T3.id = T2.t3_id
WHERE T3.id = <id>) AS existing ON T1.id = existing.t1_id
WHERE existing.t1_id IS NULL;
我也可以执行以下操作:
@settings = T3.find(<id>).t2s
T1.select(:name).where.not(id: @settings.map(&:t1_id)
假设您的模型是 T1、T2 和 T3,并且 T3 对象@t3:
T1.includes(:t2s).where.not(t2s: { t3_id: @t3.id }).references(:t2s)