我有一个通过多态关联属于配置文件的用户模型.我选择这个设计的原因可以在这里找到.总而言之,该应用程序的许多用户具有真正不同的配置文件.
class User < ActiveRecord::Base
belongs_to :profile, :dependent => :destroy, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)
class Artist < ActiveRecord::Base
has_one :user, :as => :profile
end
Run Code Online (Sandbox Code Playgroud)
class Musician < ActiveRecord::Base
has_one :user, :as => :profile
end
Run Code Online (Sandbox Code Playgroud)
选择这个设计后,我很难做出好的测试.使用FactoryGirl和RSpec,我不确定如何以最有效的方式声明关联.
factories.rb
Factory.define :user do |f|
# ... attributes on the user
# this creates a dependency on the artist factory
f.association :profile, :factory => :artist
end
Factory.define :artist do |a|
# ... attributes for the artist profile
end
Run Code Online (Sandbox Code Playgroud)
user_spec.rb
it "should …Run Code Online (Sandbox Code Playgroud) 我陷入了一个奇怪的设计问题,
我正在研究两种类型的模型,
这两种类型的配置文件的典型OO行为是相同的,但只有重要的属性/属性是常见的(非常重要的属性5-6),其他属性如"兴趣等"(几乎10-15属性)不存在用于bot配置文件
之前参与此工作的编码人员为机器人配置文件/用户配置文件创建了单独的模型/控制器,这在任何地方创建了大量冗余,并且预期难以维护,编写测试等.我想干这个,至少要解决一些/所有问题这些冗余问题.
有人建议使用单表继承作为解决方案
有人建议使用多态关联.
什么是更好的方法.我们什么时候实际使用STI?
我自己的想法是当模型的属性相同时,STI被最佳使用,并且它们的行为不同.
关于我该怎么办的想法?
这是我正在努力实现的目标:我有一个用户表,每个用户可以是十几种类型中的任何一种:演员,舞者,导演......这是在注册后确定的.每种类型的用户都可以拥有任意数量的配置文件.例如.演员可以拥有任意数量的actor_profiles,舞者可以拥有任意数量的dancer_profiles,......
问题是如何将配置文件与用户链接.一个显而易见的解决方案是为每个配置文件类型创建一个aditional表,这样我就可以在User中使用多态的belongs_to,然后在每个配置文件中使用一个简单的belongs_to,但这似乎不是最佳的.一个可以说是更好的方法是告诉rails用户使用类型为actor,这样user.profiles就可以自然地工作,而不会有任何混乱.rails是否支持这种行为,还是有比前一种方法更好的东西?谢谢.
我有一个带有授权和身份验证逻辑的用户模型。
现在我意识到我有三种不同类型的用户。我想存储有关它们每个的不同信息。
在Rails中处理此问题的最佳方法是什么?
我看过STI,但是从我的阅读中发现这是不合适的,因为最终我的数据库中会有很多NULL字段。
理想情况下,我不想为三种用户类型中的每一种重复验证/授权逻辑。
每个用户在应用程序中还将具有不同的功能。
database-design model ruby-on-rails single-table-inheritance