Rails - 如何在这些模型之间建立关联(不是基于“id”,而是基于“email”)

Posted

技术标签:

【中文标题】Rails - 如何在这些模型之间建立关联(不是基于“id”,而是基于“email”)【英文标题】:Rails - how to make association between these models (not based on "id", but on "email") 【发布时间】:2014-07-15 18:31:55 【问题描述】:

我有这些模型显然具有更多属性,但为简单起见,我将它们保留为:

class User < ActiveRecord::Base
  has_many :subs, :foreign_key => :email, :class_name => "subs"
end
class Subscription < ActiveRecord::Base
  belongs_to :plan
  belongs_to :user
end

subscriptions 表中,有一列名为email。此列指向与单个用户的电子邮件地址匹配的 users 表(email 列在两个表中都是唯一的)。

我需要根据email 值在这两个模型之间创建关联。但是当我尝试运行此查询(并获取当前登录用户的所有订阅)时:

<%= current_user.subs.inspect %>

我收到此错误消息:

uninitialized constant User::subs

我想请你们帮助我建立这个协会。

谢谢

【问题讨论】:

【参考方案1】:

未初始化的常量 User::subs

这段代码

class User < ActiveRecord::Base
  has_many :subs, :foreign_key => :email, :class_name => "subs"
end

应该是这样的

class User < ActiveRecord::Base
  has_many :subs, :foreign_key => :email, :class_name => "Subscription"
end

当您使用带有associationsclass_name 选项时,它应该指向受尊重的model classname(在您的情况下,它是Subscription 而不是subs)。因为没有具有类名的模型subs,它会抛出异常。

【讨论】:

我也试过这个(你的建议),但输出是 #&lt;ActiveRecord::Associations::CollectionProxy []&gt; -> 但在表中 subscriptions 是该用户电子邮件的 10 条记录。 我刚刚检查了生成了什么 SQL 查询:SELECT subscriptions.* FROM subscriptions WHERE subscriptions.email = 1——这显然是错误的,应该有一个电子邮件地址而不是1。如果外键是email,查询中怎么可能是ID而不是电子邮件地址? @user984621 我的帖子只回答了您遇到的主要错误,即uninitialized constant User::subs。您在哪一行收到此错误&lt;ActiveRecord::Associations::CollectionProxy []&gt;【参考方案2】:
class User < ActiveRecord::Base
  has_many :subs, :foreign_key => :email, :class_name => "Subscription", :primary_key => :email
end

class Subscription < ActiveRecord::Base
  belongs_to :plan
  belongs_to :user, :foreign_key => :email, :class_name => "Subscription", :primary_key => :email
end

你必须设置正确的类名,你还必须设置主键。

【讨论】:

以上是关于Rails - 如何在这些模型之间建立关联(不是基于“id”,而是基于“email”)的主要内容,如果未能解决你的问题,请参考以下文章

Rails has_many,如何实现嵌套关联?

Rails:不使用参数时关联两个不同的模型[:id]

Rails:如何管理同步数据的两个表之间的关联?

Rails复杂模型关联,用户和团队之间的共享文档

如何在 Ruby 中建立两个模型之间的模型关联。或者如何从一个模型中获取数据并将其用于另一个模型?

Rails - 如何让两个用户 ID 与模型相关联