Ruby on Rails多态关联

时间:2009-03-06 02:34:33

标签: ruby-on-rails

这是我想要实现的目标:我有一个用户表,每个用户可以是十几种类型中的任何一种:演员,舞者,导演......这是在注册后确定的。每种类型的用户都可以拥有任意数量的配置文件。例如。演员可以拥有任意数量的actor_profiles,舞者可以拥有任意数量的dancer_profiles,......

问题是如何将配置文件与用户链接。一个显而易见的解决方案是为每个配置文件类型创建一个aditional表,这样我就可以在User中使用多态的belongs_to,然后在每个配置文件中使用一个简单的belongs_to,但这似乎不是最佳的。一个可以说是更好的方法是告诉rails用户使用类型为actor,这样user.profiles就可以自然地工作,而不会有任何混乱。 rails是否支持这种行为,还是有比前一种方法更好的东西?感谢。

3 个答案:

答案 0 :(得分:3)

pjb的答案使用单表继承。为此,您需要向您的Users和您的Profiles *表添加一个名为type的列,以便Rails可以保存这是什么类型的用户(因为Actor,Dancer等只是User的子类)。

这意味着它们将全部保存在users / profiles表中,但是当您实例化它们时,ActiveRecord会将它们实例化为正确的类型。有了这个,你就可以打电话了

User.find

但也要做

之类的事情
Actor.find, Actor.all, etc

并将其范围限定为Actors

Google rails single table inheritance了解更多详情和示例。

  • 当然,您需要以声明User子类
  • 的方式声明您的Profile子类

class Profile<的ActiveRecord :: Base的   belongs_to:用户 端

class ActorProfile<轮廓 端

class DancerProfile<轮廓 端

答案 1 :(得分:1)

定义子类中的关系:

class User < ActiveRecord::Base
end

class Actor < User
  has_many :profiles, :class_name => "ActorProfile"
end

class Dancer < User
  has_many :profiles, :class_name => "DancerProfile"
end

答案 2 :(得分:0)

您需要确保您的User表中有一个名为“type”的列。 Rails将在该数据库字段中保存类的类型(用户,演员等)。