两个关联模型可以共享相同的连接名称吗?

Posted

技术标签:

【中文标题】两个关联模型可以共享相同的连接名称吗?【英文标题】:Can two associated models share the same join name? 【发布时间】:2011-08-02 16:43:09 【问题描述】:

我有一个User 模型,可以从他们创建的CardSignup 模型获取礼券。

不过,我还想免费赠送一个名为GiftConversion的单独模型的礼券

我的模型是这样设置的:

用户.rb

has_many :conversions, :foreign_key => :converted_by, :class_name => "CardSignup"
has_many :conversions, :foreign_key => :converted_by, :class_name => "GiftConversion"

CardSignup.rb

belongs_to                     :converted_by, :class_name => "User"

礼品转换

belongs_to                     :converted_by, :class_name => "User"

这样,我要做的是键入User.find(x).conversions,只要它们的foreign_key :converted_by 与该用户模型相关联,它就会返回CardSignup 模型和GiftConversion 模型。

不幸的是,这不能正常工作。相反,编译器只是抓取后面的语句。在这种情况下,GiftConversion,并且只允许将其识别为User.find(x).conversions

有谁知道我如何让User 模型以相同的名称共享两个模型?

【问题讨论】:

【参考方案1】:

您可能有一个自定义关联,它使用UNION 或类似的东西将两个表与自定义 SQL 语句连接起来,但我不推荐它,因为您有两个模型代表非常相似但不完全相同的东西– 单表继承的绝佳用例。

我这样做的方法是为CardSignupGiftConversion 设置一个表,并使用单表继承来连接这两个模型,因此公用表将包含一个type 列,它指定是否这是CardSignupGiftConversion

有关详细信息,请参阅此处的“单表继承”:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

【讨论】:

我真的无法理解这一点。但这似乎是个好主意。 这篇文章解释的很好:code.alexreisner.com/articles/… 它仍然没有解释如何在这个 2 对 1 / 1 对 2 多态关联中合并三个不同的模型。 我看了那篇文章 16 遍,复制了代码。这是一个愚蠢的例子。 您定义了 3 个模型,CardSignupGiftConversion 和这两个模型的父代,假设为 Conversion。 2 个子模型继承自 Conversion,而不是像其他所有模型一样从 ActiveRecord::Base 继承。然后生成迁移以仅为Conversion 创建数据库表,而不是为其他人创建数据库表。此表需要包含一个type(字符串)列,该列(自动)设置为CardSignupGiftConversion。 Rails 会自动读取该类型来决定该对象属于哪个模型。

以上是关于两个关联模型可以共享相同的连接名称吗?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间模型中的 Rails 关联

3 个表共享一个关联表

单个应用程序的两个不同数据库框架可以共享同一个连接对象吗?

两个 UIPickerView 对象可以共享同一个数据源数组吗?

在php中,用CI框架开发程序,有两个表相连接,可以同时删除两个表相关联的数据吗?怎么写删除的代码?

两个excel表格中相同数据的关联连接