难以构建父模型和多个多态子模型之间的关系

时间:2013-07-06 18:18:21

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

  • 我有User has_one :profile

  • Profile有一些属性,每个配置文件都有一些共同点。

  • 我希望某些Users拥有Sub_profileCoach_profile的{​​{1}}。

我打算在Student_profile和这些Profile之间使用多态关系,以允许每个Sub_profiles使其基本User具有适当的Profile

这就是我被打结的地方。

我很难确定Sub_profilebelongs_tohas_one :profile as: :sub_profilepolymorphic: true方法的所有属性。

此时,了解如何构建此类解决方案的人将能够写出关系 - 但我觉得我需要解释我的(有缺陷的)推理,以便按照我的方式构建它,以便有人可以帮助我理解我为什么做错了。

我的问题:

同样重要的是要注意,以防万一不明显,下面的代码结构不会导致实际按预期工作的代码(如上所述)。我遇到了错误:

dependent: :destroy

尝试类似的事情:

> Coach_profile.create
RuntimeError: Circular dependency detected while autoloading constant Coach_profile

结果为> user.profile.build_coach_profile

我的代码背后的原因:

我现在构建代码的方式,我无法弄清楚如何undefined method build_coach_profile for profilebuild_sub_profiles(作为示例)因为我设计关系的方式不允许这样做。

  • 我想要build_coach_profileProfiles,因为我希望我的belongs_to :sub_profile, polymorphic: true, dependent: :destroy表中有sub_profile_id所以我可以
    • 参考profile
    • 有不同类型的profile.sub_profile
    • 在销毁sub_profiles
    • 时销毁关联的sub_profiles
  • 我想要profilesub_profilescoach个人资料)student
    • 因此,我的has_one :profile, as: :sub_profile类型中的每一个都可以通过sub_profile表的profilesub_profile_id字段属于sub_profile_type

user.rb

profile

profile.rb

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_one :profile

end

coach_profile.rb

#  id               :integer          not null, primary key
#  user_id          :integer
#  first_name       :string(255)      not null
#  middle_name      :string(255)
#  last_name        :string(255)      not null
#  phone_number     :integer
#  birth_date       :date             not null
#  created_at       :datetime
#  updated_at       :datetime
#  sub_profile_id   :integer
#  sub_profile_type :string(255)
#

class Profile < ActiveRecord::Base
    belongs_to :user
    belongs_to :sub_profile, polymorphic: true, dependent: :destroy

    validates_presence_of :first_name, :last_name, :birth_date
    validates_length_of :phone_number, {is: 10 || 0}
end

student_profile.rb

#  id             :integer          not null, primary key
#  coaching_since :date
#  type_of_coach  :string(255)
#  bio            :text
#  created_at     :datetime
#  updated_at     :datetime
#

class CoachProfile < ActiveRecord::Base
  has_one :profile, as: :sub_profile
end

我在这里接近错误。如何在多个# id :integer not null, primary key # playing_since :date # competition_level :string(255) # learn_best_by :string(255) # desirable_coach_traits :text # goals :text # bio :text # created_at :datetime # updated_at :datetime # class StudentProfile < ActiveRecord::Base has_one :profile, as: :sub_profile end 和父sub_profiles之间正确设置多态关系?

1 个答案:

答案 0 :(得分:1)

你确定这里的关系是问题吗?你说你正在调用Coach_profile.create,但是rails类名应该像CoachProfile一样没有下划线,看起来像你的。 CoachProfile.create会出现同样的错误吗?

您可能只是混淆使用源文件时自动加载源文件的Rails代码。

此外,如Michael建议的那样切换到Profile has_one:sub_profile是行不通的,因为它无法找出要查找子配置文件的表。在多态关系中,type列是打开的与外键相同的表。