我有User
has_one :profile
。
我Profile
有一些属性,每个配置文件都有一些共同点。
我希望某些Users
拥有Sub_profile
或Coach_profile
的{{1}}。
我打算在Student_profile
和这些Profile
之间使用多态关系,以允许每个Sub_profiles
使其基本User
具有适当的Profile
。
这就是我被打结的地方。
我很难确定Sub_profile
,belongs_to
,has_one :profile
as: :sub_profile
和polymorphic: 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 profile
或build_sub_profiles
(作为示例)因为我设计关系的方式不允许这样做。
build_coach_profile
到Profiles
,因为我希望我的belongs_to :sub_profile, polymorphic: true, dependent: :destroy
表中有sub_profile_id
所以我可以
profile
profile.sub_profile
sub_profiles
sub_profiles
profile
(sub_profiles
和coach
个人资料)student
has_one :profile, as: :sub_profile
类型中的每一个都可以通过sub_profile
表的profile
和sub_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
之间正确设置多态关系?
答案 0 :(得分:1)
你确定这里的关系是问题吗?你说你正在调用Coach_profile.create
,但是rails类名应该像CoachProfile
一样没有下划线,看起来像你的。 CoachProfile.create
会出现同样的错误吗?
您可能只是混淆使用源文件时自动加载源文件的Rails代码。
此外,如Michael建议的那样切换到Profile has_one:sub_profile是行不通的,因为它无法找出要查找子配置文件的表。在多态关系中,type列是打开的与外键相同的表。