【问题标题】:has_many relation via IDs list in parenthas_many 关系通过父级中的 ID 列表
【发布时间】:2013-08-06 05:46:46
【问题描述】:

我在设计数据模型时遇到了麻烦。

我有主对象“A”及其子对象“B”,而“B”有很多“C”,但有些“C”也可以是空闲的(不属于任何“B”)。

按标准 mas_many/belongs_to Mongoid 相关外键存储在“C”中。而且它并没有那么糟糕,即使它是孤儿也能正常工作,但我认为它看起来不太好。有没有办法让 Mongoid 将子 ID 存储在父列表字段中?

【问题讨论】:

  • 所以你想让 A 知道它的 B C 吗?你可以更好地解释你的模型是什么样子以及你想用它们做什么,也可以给出更好的名字,比如 foo、bar 和 baz 之类的
  • 不,我想让B知道Cs,但是C对B一无所知
  • 那么为什么你认为数组是必要的?
  • 我认为这是一种不经意的方法,在我的情况下,我需要找到 C,B 拥有的频率高于找到 Cc 父级
  • 如果在 C 上为 b_id 添加索引,性能可能比查询 id 数组更好。

标签: ruby-on-rails ruby mongodb database-design mongoid


【解决方案1】:

您描述的内容听起来像 belongs to many,有一种方法可以通过在 B 类上使用 has_and_belongs_to_many 关系来实现。

但在我看来,您最初的方法在语义上更好,但这取决于您自己的选择。

【讨论】:

    【解决方案2】:

    对于未来的观众......

    我结束使用:

    在 has_and_belongs_to_many 的 before_add 回调中,我添加了类似 object_to_add.c_id ||= self.id 的内容。这样您就可以将 ID 列在父级中。

    具有多个类别的播放列表示例:

    class Playlist
      has_and_belongs_to_many :categories, before_add: :add_playlist_id, inverse_of: :playlist
    
      private
    
      def add_playlist_id(category)
        category.playlist_id ||= id
      end
    end
    
    
    class Category
      belongs_to :playlist, inverse_of: :categories
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多