В моем приложении город может иметь много ссылок. Ссылка соединяет два города вместе и двунаправлена, поэтому ссылка не имеет «от» и «до». Это приводит к следующему db schema
:has_many отношение с двумя внешними ключами
create_table "links", force: true do |t|
t.integer "endpoint1_id"
t.integer "endpoint2_id"
t.integer "capacity"
end
create_table "cities", force: true do |t|
t.string "name"
t.string "lat"
t.string "long"
end
В моей модели ActiveRecord, я хочу объявить связь между двумя таблицами. Так как я не могу объявить два внешних ключей при настройке has_many
отношения, я работал вокруг того, как это:
class City < ActiveRecord::Base
# has_many with two foreign keys?
# has_many :links
def links
Link.where("endpoint1_id=? OR links.endpoint2_id=?", id, id)
end
end
class Link < ActiveRecord::Base
belongs_to :endpoint1, :class_name => 'City'
belongs_to :endpoint2, :class_name => 'City'
end
Это позволяет мне делать: City.find(1).links
, но, кажется, не правильное решение и не навязывает никакого наследства. Кроме того, из link
я не могу найти город отношений, если не пройду и city.endpoint1
, и city.endpoint2
.
Есть ли более элегантные решения для определения отношения has_many
с двумя внешними ключами? Или я должен уйти от этого подхода и как-то изменить свой db schema
?
Вы можете переписать первую строку своего вопроса? Вы хотите, чтобы в городе было много ссылок, а также было соединение по городу и городу? – kirqe
Возможно, вы могли бы работать с наборами 'has_many', например' has_many: links_to' и 'has_many: links_from'. И затем больше или меньше делаете то, что делаете сейчас? – Albin