【问题标题】:Issue with Rails Polymorphic AssociationRails 多态关联的问题
【发布时间】:2016-08-16 01:28:38
【问题描述】:

我正在尝试为用户创建一个应用,以创建他们拥有或希望购买的手表列表。我希望用户能够描述他们手表的很多细节/属性。我正在尝试创建父/子关联,但不使用 STI,因为子模型具有不同的数据,并且我不希望表中有一堆空值。

我有 4 张桌子:

  • 用户
    • 一些用户属性
  • 手表
    • user_id
    • 所有手表、名称、品牌等共有的一系列属性。
    • content_id
    • content_type
  • mechanical_watches
    • 一些仅适用于机械表的属性
  • 石英表
    • 一些仅适用于石英表的属性

模型

class User < ApplicationRecord
 include Clearance::User

 has_many :watches
end

class Watch < ApplicationRecord
 belongs_to :user
 belongs_to :content, polymorphic: true
end

class MechanicalWatch < Watch
 has_one :watch, as: :content
end

class QuartzWatch < Watch
 has_one :watch, as: :content
end

我不能 100% 确定我是否正确设置了关联。但我遇到的问题是,当我将 MechanicalWatch 输入控制台时,它只返回 Watch 上的属性,而不是mechanical_watches 表中的任何属性。我已经尝试了我能想到的一切。关于我做错了什么的任何想法。

我正在为数据库使用 Rails 5、Ruby 2.3.1 和 Postgres。

【问题讨论】:

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


    【解决方案1】:

    我认为您不想继承 MechanicalWatchQuartzWatch。它们似乎是与Watch 不同的表。你显示的关系是MechanicalWatch“有一个”Watch,而不是MechanicalWatch“是一个”Watch

    你会改变

    class MechanicalWatch &lt; Watch

    class MechanicalWatch

    【讨论】:

    • 好吧,这有点道理。也许MechanicalWatch 不应该“拥有”WatchMechanicalWatchWatch 的一种类型。无论哪种方式,我都更改为class QuartzWatch &lt; ApplicationRecordclass MechanicalWatch &lt; ApplicationRecord,但是现在在控制台中而不是只获取父Watch 属性,现在我只在运行MechanicalWatch.new 时获取MechanicalWatch 属性。
    • 根据您的设置方式,这听起来很正确。由于belongs_to 在Watch 上,MechanicalWatch 的外键存储在Watch 上。 MechanicalWatch 上可能还没有直接存储任何字段。它只是对 Watch 的引用。
    【解决方案2】:

    据我了解,您希望能够创建一个mechanical_watch 实例,但仍然能够在手表模型上设置字段。

    即MechanicalWatch.new.field_on_watch = 4

    如果是正确的,那么你可以看看这个:

    http://api.rubyonrails.org/classes/Module.html

    您正在寻找的模式是委托。

    但要问一个重要的问题:您是否打算以多态方式使用手表。 IE。您会在同一页面上显示所有类型的手表吗?还是会分开显示不同的手表?

    【讨论】:

    • 我想把所有手表一起展示,手表可以是石英型的,也可以是机械型的。
    • 拥有那种“类型”对你有什么好处?
    • 不同的类型有不同的属性。石英表有一套属性,机械表有一套不同的属性。手表具有两种类型共有的属性。
    • 它们可以有不同的属性而不被定义为某种类型。你从将它定义为一种类型中得到了什么。如果您将额外的属性作为哈希存储在单个 Watch 类上会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多