【问题标题】:Rails through relation with has_many and belongs_toRails 通过与 has_many 和 belongs_to 的关系
【发布时间】:2020-05-16 07:42:03
【问题描述】:

我需要定义 Packages 和 Delivers 之间的关系: 1 交付罐有许多包裹。 但是包裹不能有送货。包裹只能属于 Delivers。

交付 has_many 包,但包只能属于_to 交付(或分配给分配,我不知道)。

我应该有Assignment 表,存储deliver_id 和package_id。当我分配要交付的包裹时 - 它应该创建新的分配记录

看来,我需要使用:

through: :package_assignments  

但我不明白包裹、交付和分配之间的关系。

现在我定义 package.rb:

class Package < ApplicationRecord
  belongs_to :assignments

deliver.rb:

class Deliver < ApplicationRecord
  has_many :assignments
  has_many :packages, through: :assignments 

assignment.rb:

class Assignment < ApplicationRecord
  belongs_to :deliver
  has_many :packages

【问题讨论】:

  • 你的要求是矛盾的:“1个交付可以得到很多包”:一个交付has_many包。 “而 1 个包裹只能分配给 1 个交付”:一个交付 has_one 包裹?
  • 你真的应该重命名模型Delivery 这是一个名词。模型应该是名词,因为它们代表业务模型中的事物。 Deliver 是动词。
  • 我的意思是 1 个交付罐有很多包裹。但是包裹不能有送货。我的意思是这不是关于包裹有很多交付。
  • 我重命名为名词。谢谢
  • 包裹不能有 Delivers 是什么意思?交付中的简单has_many 和包装中的belongs_to 还不够吗?您不必为此创建中介 Assignment 表。

标签: ruby-on-rails activerecord has-many relation belongs-to


【解决方案1】:

结果,我通过Assignment实现了Package和Delivery之间的many_to_many关系。它允许分配,例如,要交付的包裹,它会自动创建带有 package_id 和 Deliver_id 的分配记录。

交付模型:

class Deliver < ApplicationRecord
  has_many :assignments, dependent: :destroy
  has_many :packages, through: :assignments
end

封装型号:

class Package < ApplicationRecord
  has_many :assignments, dependent: :destroy
  has_many :delivers, through: :assignments
end

分配模型:

class Assignment < ApplicationRecord
  belongs_to :deliver
  belongs_to :package
end

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多