【问题标题】:Ruby on Rails 6 ActiveRecord associations, one model with multiple references to another modelRuby on Rails 6 ActiveRecord 关联,一个模型多次引用另一个模型
【发布时间】:2021-08-06 06:50:27
【问题描述】:

我正在构建一个 Ruby on Rails 6 应用程序,其中有一个模型 Archive 和另一个模型 ArchiveAgencies。在Archive 模型中,我必须有一个发送方代理和一个接收方代理,它们应该代表ArchiveAgencies

在阅读 Rails 文档和一些 StackOverflow QA 之后:

我想出了这种方法:

型号

class Archive < ActiveRecord::Base
  belongs_to :sender_agency, class_name: ArchiveAgencies, foreign_key: "sender_agency_id"
  belongs_to :receiver_agency, class_name: ArchiveAgencies, foreign_key: "receiver_agency_id"
end
class ArchiveAgency < ActiveRecord::Base
  has_many :archives, inverse_of: 'sender_agency'
  has_many :archives, inverse_of: 'receiver_agency'
end

迁移

class CreateArchiveAgencies < ActiveRecord::Migration[6.0]
  def change
    create_table :archives do |t|
      t.string :name

      t.timestamps
    end
  end
end
class CreateArchives < ActiveRecord::Migration[6.0]
  def change
    create_table :archives do |t|
      t.references :sender_agency, foreign_key: { to_table: :archive_agencies }
      t.references :receiver_agency, foreign_key: { to_table: :archive_agencies }

      t.timestamps
    end
  end
end

对于这种情况,这是最好的方法吗? 在模型ArchiveAgency 中有两个inverse_of 语句会起作用吗?

【问题讨论】:

    标签: ruby-on-rails database activerecord ruby-on-rails-6


    【解决方案1】:

    如果您声明多个具有相同名称的关联,最后一个将覆盖其他关联。

    相反,您需要为每个关联使用唯一名称并正确配置它们:

    class ArchiveAgency < ActiveRecord::Base
      has_many :archives_as_sender, 
         inverse_of: :sender_agency,
         foreign_key: :sender_agency_id,
         class_name: 'Archive'
    
      has_many :archives_as_receiver, 
         inverse_of: :receiver_agency,
         foreign_key: :receiver_agency_id,
         class_name: 'Archive'
    end
    
    class Archive < ActiveRecord::Base
      belongs_to :sender_agency, # foreign_key can be derived from the name
         class_name: 'ArchiveAgency', # needs to be a string - not the class itself
         inverse_of: :archives_as_sender 
      belongs_to :receiver_agency, 
         class_name: 'ArchiveAgency'
         inverse_of: :archives_as_receiver
    end
    

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多