Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails多态关联_Ruby On Rails - Fatal编程技术网

Ruby on rails RubyonRails多态关联

Ruby on rails RubyonRails多态关联,ruby-on-rails,Ruby On Rails,以下是我试图实现的目标:我有一个用户表,每个用户可以是十几种类型中的任意一种:演员、舞者、导演……这是注册后确定的。每种类型的用户可以有任意数量的配置文件。演员可以有任意数量的演员简介,舞者可以有任意数量的舞者简介 问题是如何将配置文件链接到用户。一个明显的解决方案是为每种配置文件类型创建一个传统的表,这样我就可以在用户中使用多态的belishto,然后在每个配置文件中使用一个简单的belishto,但这似乎不是最佳的。可以说更好的方法是告诉rails用户它是actor类型的,这样user.pr

以下是我试图实现的目标:我有一个用户表,每个用户可以是十几种类型中的任意一种:演员、舞者、导演……这是注册后确定的。每种类型的用户可以有任意数量的配置文件。演员可以有任意数量的演员简介,舞者可以有任意数量的舞者简介


问题是如何将配置文件链接到用户。一个明显的解决方案是为每种配置文件类型创建一个传统的表,这样我就可以在用户中使用多态的belishto,然后在每个配置文件中使用一个简单的belishto,但这似乎不是最佳的。可以说更好的方法是告诉rails用户它是actor类型的,这样user.profiles就可以自然工作,不会出现任何混乱。rails是否支持这种行为,或者是否有比前一种方法更好的方法?谢谢。

定义子类中的关系:

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
class用户“ActorProfile”
结束
类舞者<用户
有多个:配置文件,:class\u name=>“舞者配置文件”
结束

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

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

User.find
但也会做类似的事情

Actor.find, Actor.all, etc
并且只限于演员

Google
rails单表继承
,了解更多详细信息和示例

  • 当然,您需要以与声明用户子类相同的方式声明概要文件子类
类配置文件 类ActorProfile<配置文件 结束

class-Profile
etc

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