有一个场景,一时间想不到怎么处理比较好,写出来看看各位有没有建议。
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]})
这样子应该可以
#3 楼 @lionzixuanyuan 感谢回复。
如果真的只是单纯的搜索场景,推荐使用额外的搜索服务,es 或者 solr。数据量太大的话,这个搜索太费资源了。
A1 对应 C1, C2, C3, C4 A2 对应 C2, C3, C4, C5
你说的这个是多对多关系了吧?
我建议是分步走,从 C 表里搜出 ID List,然后在关系表中搜出 AID List,然后再找 A。
#5 楼 @zj0713001 这个也是我在考虑的一个问题。直接使用 es 暂时看是最方便可靠的办法,且可以把搜索一块独立开来,因为按规划,这一块后面承担的压力不会小。
#6 楼 @msg7086 感谢回复。