Rails关联has_many和has_many通过相同的STI模型

时间:2017-01-26 00:29:17

标签: ruby-on-rails associations polymorphic-associations sti

我有一个模型注释。 注释非常有用,在整个应用程序中用于许多目的。

我们有另一个型号用户,这些是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。 我想看看我写的笔记,以及其他人写过关于我的笔记,以及关于我的东西的笔记。

有一种简单的方法吗? 我正在努力争取两分。

  1. 如何连接有关我的东西的笔记?

    has_many:thing_notes,通过:::things,source :: notes

  2. 有效,但我想知道这是否是接近它的正确方法。

    另外,我对反向感兴趣(这也很有用),在这种情况下忽略谁可能写了注释,返回相关的user1,如果有的话。但...

    delegate :user1, to: :notable
    
    如果user1已经是潜在的notable_type,则

    没有意义。

    1. 如何整理所有笔记(无论什么类型)并归还?
    2. @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)
      

      触及丑陋的一面,只会变得更加丑陋......

      希望对喜欢解决这些难题的人有意义......

1 个答案:

答案 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