【问题标题】:How do I query a database with polymorphic association?如何查询具有多态关联的数据库?
【发布时间】:2019-10-25 17:54:40
【问题描述】:

假设,在一个 Rails 应用程序(使用 postgresql)上,我有这个数据库,它在 work_steps 和 sub_assemblies / 部分之间具有多态关联:

Part.rb

belongs_to :sub_assembly, optional: true
has_many :work_steps, as: :component
belongs_to :site
belongs_to :car

子程序集.rb

has_many :work_steps, as: :component
has_many :parts

work_step.rb

  belongs_to :component, polymorphic: true

现在,我想查询我的数据库:我想要一个使用特定站点数组和特定汽车数组过滤的所有工作步骤的列表。 例如,链接到属于站点 A 和汽车 X 和 Z 的零件的所有工作步骤。

由于与 sub_assemblies 的多态关联以及链接到部件表的同一个表,我不知道该怎么做。

最后,我需要一个 ActiveRecord 关系。你会如何简单地做到这一点?我尝试了很多东西,但都没有成功。

有人帮我吗?

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    好的,所以 work_step 是您希望能够被多个模型使用的。

    所以在 CreateWorkSteps 的迁移中:

    t.references :component, polymorphic: true
    

    基本上是这样

    t.integer :component_id # Refers to id (of sub-assembly or part)
    t.string :component_type # Refers to type of object (sub-assembly or part)
    add_index :work_steps, [:component_type, component_id]
    

    现在在你的模型中:

    work_step.rb

    belongs_to :component, polymorphic: true
    

    sub_assembly.rb

    has_many :work_steps, as: :component
    has_many :parts
    

    part.rb

    has_many :work_steps, as: :component
    belongs_to :site
    belongs_to :car
    belongs_to :sub_assembly, optional: true
    

    好的,所以你想查询你的数据库并获取

    • 工作步​​骤
    • 链接到部件
    • 属于站点 A 和汽车 X 和 Z

    所以,这里是您应该在 ActiveRecord 中执行的步骤列表(我不会给出单个查询的答案,因为这太费力了。此外,步骤顺序是逻辑顺序,但请记住 ActiveRecord 查询使用惰性求值和 SQL 查询按特定顺序求值。)

    1. #用场地和汽车加入零件
    2. 使用#Where siteName is in [A], carName is in [X, Z]
    3. 现在,您 LEFT 加入 sub_assembly(因此即使零件没有 sub_assembly_id,它也不会被删除)。
    4. 现在这是令人讨厌的步骤。对于您的第一次加入,您需要将 parts_id 与 component_id AND component_type == "Part" 加入(请记住在加入时为您的表添加前缀,例如 work_steps.component_id 并从头开始执行此操作。)
    5. 对于您的第二次加入,您需要使用 component_id AND component_type == "Sub_assembly" 加入 sub_assembly_id
    6. 现在您有一个巨大的 ActiveRecord 对象,只选择构成 work_step 的内容。

    祝你好运!我不会用预先写好的答案牵着你的手,通过......因为我懒得启动 Rails,进行迁移,制作模型,为模型播种,然后自己编写查询。 ;)

    哦,是的,我最终还是给出了一个查询答案。

    【讨论】:

    • 感谢您的回答,但我不知道它是如何工作的。所以我是这样开始的:WorkStep.joins("INNER JOIN parts ON parts.id = work_steps.component_id AND component_type = 'Part'")。但是如果我想添加一个新的连接(第 5 步),我不能同时拥有 component_type = "Partcomponent_type = "Sub_assembly"。当我尝试WorkStep.joins("INNER JOIN parts ON parts.id = work_steps.component_id AND component_type = 'Part'").joins("INNER JOIN sub_assemblies ON sub_assemblies.id = work_steps.component_id AND component_type = 'SubAssembly'") 时,结果是一个空数组。
    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2015-02-20
    • 2013-07-22
    • 1970-01-01
    • 2013-07-31
    • 2019-08-31
    • 2016-03-13
    • 2011-03-20
    相关资源
    最近更新 更多