我有一个模型注释。 注释非常有用,在整个应用程序中用于许多目的。
我们有另一个型号用户,这些是STI之间的分割 User1s 和 User2s
我们有第三个模型Thing,这是属于用户的东西...我会暂时将它留在那里,因为它触摸得更复杂,(还有其他模型有点像可以制作的东西注意事项)。
Note.rb
belongs_to :user #This signifies that the user wrote the note
belongs_to :notable, polymorphic: :true #This is what the note is referring to
User.rb
has_many :user_notes, class_name: "Note", foreign_key: "user_id"
#signifies the note was written by the User
User1.rb < User
has_many :notes, as: :notable
#Signifies the note was about the User1
has_many :things
User2.rb < User
has_many :notes, as: :notable
#Signifies the note was about the User2
Thing.rb
belongs_to :user1
has_many :notes, as: :notable
#The note is about the thing
这些可以是,但通常不是自我指涉的(我写了一篇关于我自己的说明)。
User1s通常会写有关User2s或User2s Things的注释,以便User2可以看到它们。
我认为我在重命名user_notes时采用了正确的路线。
我正在努力学习如何收集可能与我有关的所有笔记。 也就是说我是用户1。 我想看看我写的笔记,以及其他人写过关于我的笔记,以及关于我的东西的笔记。
有一种简单的方法吗? 我正在努力争取两分。
如何连接有关我的东西的笔记?
has_many:thing_notes,通过:::things,source :: notes
有效,但我想知道这是否是接近它的正确方法。
另外,我对反向感兴趣(这也很有用),在这种情况下忽略谁可能写了注释,返回相关的user1,如果有的话。但...
delegate :user1, to: :notable
如果user1已经是潜在的notable_type,则没有意义。
即
@user1.notes
只返回关于我的笔记
@user1.user_notes
将返回我写过的笔记
@user1.thing_notes
会返回有关我的事情的说明
我可以将它们合并在一起,但是我会冒着烦人的重复,并且当它们都是一种类型时,进行多个数据库调用并丢失数据库排序似乎是一种耻辱......
是否有明显的方式来获取所有笔记......?
Note.where("(user_id = :user1_id) OR (notable_id = :user1_id AND notable_type = 'User') OR (notable_type = 'Thing' AND notable_id IN (:things))", user1_id: user1.id, things:user1.thing_ids)
触及丑陋的一面,只会变得更加丑陋......
希望对喜欢解决这些难题的人有意义......
答案 0 :(得分:1)
对于排序规则,如果您使用Rails 5,则可以执行以下操作来简化原始SQL:
Note.where(user: user1).or(Note.where(notable: user1)).or(Note.where(notable: user1.things))
如果您不使用Rails 5,则可以将此gem添加到相同的功能中:https://github.com/Eric-Guo/where-or