繁体   English   中英

Rails has_many通过–如何为联接表指定键列?

[英]Rails has_many through – how to specify key columns for join table?

tl; dr

我想对连接表的两列使用url_id Rails坚持使用documents表中的主键。


我有带有url_id属性的自引用Document类。 一个文档可以引用其他文档。 我想要以url_id作为连接值的联接表,如下所示:

  • 所需状态:

     Documents: Document relationships: ID | URL_ID | REFERRING_ID | REFERENCED_ID | ---|--------| -------------|---------------| 1 | 1234 | 1234 | 1266 | 2 | 1266 | 1234 | 2345 | 3 | 2345 | 1266 | 426 | 4 | 426 | 444 | 750 | 5 | 750 | 7 | 444 | 

但是我不能说服Rails使用url_id作为referring_id密钥。

有了这样的模式,我可以使用下面的SQL代码片段来获取相关文档。

SELECT "documents".* FROM "documents"
INNER JOIN "document_relationships"
ON "documents"."url_id" = "document_relationships"."referenced_id"
WHERE "document_relationships"."referring_id" = ?

经过ActiveRecord文档之后,我能得到的最接近的是:

  • 实际状态:

     REFERRING_ID | REFERENCED_ID | -------------|---------------| 1 | 1266 | 1 | 2345 | 2 | 426 | 7 | 750 | 

Nb。 Rails的使用,而不是DOCUMENT_IDurl_idreferring_id列。

  • 文件类别:

     class Document < ApplicationRecord has_many :document_relationships, foreign_key: :referring_id has_many :related, through: :document_relationships, source: :referenced end class DocumentRelationship < ApplicationRecord belongs_to :referring, class_name: "Document" belongs_to :referenced, class_name: "Document", primary_key: :url_id end 

您必须在document_relationships的两端都设置primary_key- 引用关联:

class Document < ApplicationRecord
  has_many :document_relationships, foreign_key: :referring_id, primary_key: :url_id
  has_many :related, through: :document_relationships, source: :referenced
end

class DocumentRelationship < ApplicationRecord
  belongs_to :referring, class_name: "Document", primary_key: :url_id
  belongs_to :referenced, class_name: "Document", primary_key: :url_id
end

# In case the url_id is not unique do not forget to use sth like Array's #uniq :
# Document.first.related.to_a.uniq(&:url_id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM