【问题标题】:Get items with Rails relations获取具有 Rails 关系的项目
【发布时间】:2021-10-12 16:51:24
【问题描述】:

我有两个具有这样关系的模型:

class Ticket < ActiveRecord::Base
 belongs_to :group
end
class User < ActiveRecord::Base
 has_and_belongs_to_many :groups
 has_many :tickets, as: :assignable
end
class Group < ActiveRecord::Base
 has_many :tickets, -> { order(:created_at) }
 has_and_belongs_to_many :users
end

我需要获取属于用户拥有的同一组的所有票证。 我怎样才能做到这一点?非常感谢!

【问题讨论】:

    标签: ruby-on-rails has-many has-and-belongs-to-many


    【解决方案1】:

    目前,您的关系不完整,因此 Rails 无法正常工作。如果用户为 has_many 票证,则票证必须为 belong_to(或至少为 has_one)用户。或者,用户可以have_manyTicketsthroughGroup,在这种情况下似乎更有可能。

    但是,即便如此,您的 Group 模型在做什么仍不清楚。特别是,尚不清楚您打算如何将其与 User 关联 - 这看起来是一个相当复杂的关系。

    不过,首先,尝试像这样设置模型:

    class Ticket < ApplicationRecord
     belongs_to :group
    end
    
    class Group < ApplicationRecord
     belongs_to :user
     has_many :tickets, dependent: :destroy
    end
    
    class User < ApplicationRecord
     has_many :groups, dependent: :destroy
     has_many :tickets, through: :groups
    end
    

    (你会看到我也从 ApplicationRecord 继承了这些模型,我一直都是这样做的。)

    如果你按照上面的方式设置,你可以通过简单的@user.tickets获取你的票证记录。

    如果可行,您可以为组和用户添加额外的 HABTM 关系。但请注意,HABTM 关系可能很复杂,使用它们的方式有好有坏。

    (如果您真正想要的主要关系是组 > 用户 > 票证,请告诉我,我可以进行相应调整。)

    【讨论】:

    • ApplicationRecord 是在 Rails 5 中引入的。以前的版本会生成直接从 ActiveRecord::Base 继承的模型,您需要创建 ApplicationRecord 类,这通常是升级遗留应用程序时执行的步骤之一。
    • 感谢@max - 鉴于我是从 Rails 5 开始的,这就解释了!
    • 非常感谢您的帮助,谢谢!我用丢失的模型更新了帖子。不幸的是,当我执行 @user.tickets 时,我没有得到想要的结果,因为它只返回当前用户创建的票证。我想获取具有相同用户组但可能是由另一个用户创建的所有票证。有点复杂=/
    • 在这种情况下,您需要@group.tickets。 Rails 为所有关系提供了这样的帮助器 - 只要您正确定义模型之间的关系,Rails 就会帮助您!
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2011-09-07
    • 2014-09-21
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多