【问题标题】:RoR: How to load the related record in a one-to-one relationshipRoR:如何以一对一的关系加载相关记录
【发布时间】:2010-05-26 11:55:05
【问题描述】:

我有以下:

class User < ActiveRecord::Base
 has_one :subscription
end
class Subscription < ActiveRecord::Base
 belongs_to :user
end

用户有一个 subscription_id,因此只能有一个订阅(这是我想要的)。

效果很好,但现在我可以了:

@users = User.find(:all)

我希望包含所有订阅。

我试过了:

@users = User.find(:all, :include=>[:subscription]) # include subscription

但这希望订阅表有一个 user_id(SQLite3::SQLException: 没有这样的列:subscriptions.user_id: SELECT "subscriptions".* FROM "subscriptions" WHERE ("subscriptions".user_id = 2))。

这(当然)不是我想要的。

我是 RoR 的新手,在我的书籍和网络上都找不到这个案例的好例子。

【问题讨论】:

  • 你想要所有订阅还是用户的订阅?

标签: ruby-on-rails ruby


【解决方案1】:

我认为您在模型对象上的关联方式错误。你应该有

class User < ActiveRecord::Base
  belongs_to :subscription
end
class Subscription < ActiveRecord::Base
  has_one :user
end

belongs_to 应该用在定义外键的关联一侧(在本例中为 subscription_id)。从语义上讲,这可能看起来有点奇怪,但这是因为在这种情况下,rails 会期望 user_id 出现在订阅表上,而不是像你所拥有的那样。

之后

User.find(:all, :include=>[:subscription]) 

应该没问题

【讨论】:

    【解决方案2】:

    首先如果用户有外键(subscription_id)那么它应该有belongs_to 而不是相反。正如 Rails 文档所说的 has_one 方法:

    "只有当其他类包含外键时才应使用此方法。如果当前类包含外键,则应使用belongs_to"

    (取自:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001834

    其次,在您的示例中,您尝试查找用户并包含用户。你需要这样做:

    @users = User.find(:all, :include=>[:subscription])
    

    【讨论】:

    • 如果我不清楚...用户需要拥有belongs_to :subscription 并且订阅需要拥有has_many :users
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2013-10-29
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多