【问题标题】:Active Record, how to make N-N relationship properly?Active Record,如何正确建立 N-N 关系?
【发布时间】:2020-08-25 15:16:28
【问题描述】:

我在表 Notebook 和 Part 之间有 N-N 关系。一个 Notebook 有许多 Parts,一个 Part 可以出现在许多 Notebooks 中。这是架构的示例:

在其他方法中,正如 AJFaraday 在 cmets 中所建议的那样,我将有一个连接表 notebook-parts,其作用是识别它是 gpu、处理器等:

如何使用方法 2 在 Rails 中调用 notebook.processor, notebook.gpu 等?而且我还需要一些空的部分,因为有些笔记本没有专用的 gpu,或者可能只有 ssd 而没有 hd 等?

模型的关系应该是怎样的?

【问题讨论】:

  • 我不确定您为什么要在此处使用多个连接表。一个标准的方法是一个名为 NOTEBOOK_PARTS 的表,如果你需要定义它的处理器、gpu 等,它可以有一个“角色”属性。
  • 你是 100% 正确的。
  • 嘿 AJ,你能看看更新吗?

标签: ruby-on-rails postgresql activerecord rails-admin


【解决方案1】:

只需为连接表创建一个模型并在两个模型中引用它。

# models/notebook_part.rb
class NotebookPart
  belongs_to :notebook
  belongs_to :part
end

# models/part.rb
class Part
  has_many :notebook_parts
  has_many :notebooks, though: :notebook_parts
end

# models/notebook.rb
class Notebook
  has_many :notebook_parts
  has_many :parts, though: :notebook_parts
end

然后在您的笔记本模型中,您可以创建基于部分角色的方法,例如:

# models/notebook.rb
def processors
  parts.where(part_role: :processor)
end

然后为您认为必要的任何其他角色制作该列表,或者考虑一些元编程循环来为您制作这些列表。

【讨论】:

  • 但是我如何在笔记本实例中调用 .processor 呢?说:acer = Notebook.where(name: 'Acer') 我想:acer.processor 并返回一个处理器实例。
  • 如果您有验证以确保仅将一个处理器分配给给定的笔记本电脑,您可以使用与我建议的方法完全相同的方法,最后使用 .first
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多