两个关联模型可以共享相同的连接名称吗?
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 语句连接起来,但我不推荐它,因为您有两个模型代表非常相似但不完全相同的东西– 单表继承的绝佳用例。
我这样做的方法是为CardSignup
和GiftConversion
设置一个表,并使用单表继承来连接这两个模型,因此公用表将包含一个type
列,它指定是否这是CardSignup
或GiftConversion
。
有关详细信息,请参阅此处的“单表继承”:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html
【讨论】:
我真的无法理解这一点。但这似乎是个好主意。 这篇文章解释的很好:code.alexreisner.com/articles/… 它仍然没有解释如何在这个 2 对 1 / 1 对 2 多态关联中合并三个不同的模型。 我看了那篇文章 16 遍,复制了代码。这是一个愚蠢的例子。 您定义了 3 个模型,CardSignup
、GiftConversion
和这两个模型的父代,假设为 Conversion
。 2 个子模型继承自 Conversion
,而不是像其他所有模型一样从 ActiveRecord::Base
继承。然后生成迁移以仅为Conversion
创建数据库表,而不是为其他人创建数据库表。此表需要包含一个type
(字符串)列,该列(自动)设置为CardSignup
或GiftConversion
。 Rails 会自动读取该类型来决定该对象属于哪个模型。以上是关于两个关联模型可以共享相同的连接名称吗?的主要内容,如果未能解决你的问题,请参考以下文章
两个 UIPickerView 对象可以共享同一个数据源数组吗?