新手问题 关于一对多关系的反向查询

leiz_me · 2016年01月13日 · 最后由 leiz_me 回复于 2016年01月19日 · 2649 次阅读

有一个场景,一时间想不到怎么处理比较好,写出来看看各位有没有建议。

Rails app.

有三个 resources, A, B, C 关系是 A has_many C B has_many C A has_many B

就是说,存在 C1, C2, C3 同时对应 A1 和 B1

这里有一个简单的搜索场景,在输入框输入 "C1 C2 C3" 作为一个 keyword,希望能返回 A1(或者 B1,这里其实无所谓,能返回 A1 肯定能找到 B1)

这样一个场景用什么方式会比较好处理?

谢谢。

class A
 has_many  :B
 has_many  :C, through:  :B

class B
has_many :C
belongs_to :A

class C
belongs_to :A
belongs_to :B

这样 OK 吗?

#1 楼 @mumu 感谢回复。 不过不是这样的问题。 你在回复里只是单纯地把 ABC 用 associations 连接了起来,我想探讨的点是基于这样一个关联关系,怎样去从 C 反查 A(或 B).

而且你误解了我关于 A 和 B 的关系,在 A 中不需要 through: B。

我再举个例子。

假设有 A1 对应 C1,C2,C3,C4 A2 对应 C2,C3,C4,C5 A3 对应 C2,C3,C4,C8 A4 对应 C3,C4,C8,C9 A5 对应 C4,C8,C9,C20

用 C2,C3,C4 作为 keyword 可以反查出 A1,A2,A3 用 C4,C8,C9 作为 keyword 可以反查出 A4,A5

这里可以忽略 B,可能在主贴上提及 B 产生了误会。

我考虑到一个办法是,用 A.Cs.include(C2,C3,C4)?来进行判断,但是这样就要遍历 A。

在性能上是不是会有其他更好的解决方案?

这个是我期望得到建议的地方。 谢谢。

A.joins(:cs).where(cs: {id: [c2.id, c3.id, c4.id]})

这样子应该可以

如果真的只是单纯的搜索场景,推荐使用额外的搜索服务,es 或者 solr。数据量太大的话,这个搜索太费资源了。

A1 对应 C1, C2, C3, C4 A2 对应 C2, C3, C4, C5

你说的这个是多对多关系了吧?

我建议是分步走,从 C 表里搜出 ID List,然后在关系表中搜出 AID List,然后再找 A。

#5 楼 @zj0713001 这个也是我在考虑的一个问题。直接使用 es 暂时看是最方便可靠的办法,且可以把搜索一块独立开来,因为按规划,这一块后面承担的压力不会小。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号