Rails через has_many - как указать ключевые столбцы для таблицы соединений? - PullRequest
0 голосов
/ 04 мая 2018

ТЛ; др

Я хотел бы использовать url_id для обоих столбцов объединяемой таблицы. Rails настаивает на использовании первичного ключа из таблицы документов.


У меня есть собственная ссылка Document класс с атрибутом url_id . Документ может ссылаться на другие документы. Я хотел бы соединить таблицу с 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    |
    

Но я не могу убедить рельсы использовать 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           |
    
* 1 042 * Nb. Rails использует document_id вместо url_id для referring_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
    

1 Ответ

0 голосов
/ 04 мая 2018

Вы должны установить primary_key на обоих концах document_relationships - , ссылаясь на ассоциацию:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...