首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Rails多态关联

问Ruby on Rails多态关联
EN

Stack Overflow用户
提问于 2009-03-06 02:34:33
回答 3查看 5.5K关注 0票数 5

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

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

EN

回答 3

Stack Overflow用户

发布于 2009-03-09 22:02:20

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

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

代码语言:javascript
复制
User.find

但也会做像这样的事情

代码语言:javascript
复制
Actor.find, Actor.all, etc

并将其作用域仅限于Actor

Google rails single table inheritance获取更多细节和例子。

当然,您需要以声明用户子类的方式来声明您的配置文件子类

类配置文件< ActiveRecord::Base belongs_to :用户端

类ActorProfile <配置文件结束

类DancerProfile <配置文件结束

等

票数 3
EN

Stack Overflow用户

发布于 2009-03-06 02:42:34

定义子类中的关系:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2009-05-22 13:36:03

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/617535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档