2014-12-15 2 views
4

내 앱에는 도시에 여러 링크가있을 수 있습니다. 링크는 두 도시를 연결하며 양방향입니다. 결과적으로 링크에는 '보낸 사람'과 '가는 사람'이 없습니다. 이것은 다음과 같은 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 

, 나는 두 테이블 사이의 관계를 선언합니다. 나는 has_many 관계를 설정할 때 두 개의 외래 키를 선언 할 수없는 것 때문에, 나는 이렇게 그 주위에 일 : City.find(1).links을하지만 적절한 솔루션을하지 보인다 및 상속을 적용하지 않습니다 :이 날을 수행 할 수 있습니다

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 

. 또한 link에서 city.endpoint1city.endpoint2을 모두 통과하지 않으면 관련 도시를 찾을 수 없습니다.

두 개의 외래 키와 has_many 관계를 정의하는 더 좋은 해결책이 있습니까? 아니면이 접근법을 벗어나서 어쨌든 db schema을 변경해야합니까?

+0

질문의 첫 번째 줄을 다시 쓸 수 있습니까? 도시가 많은 연결 고리를 가지고 있고 도시 - 연결 도시 연결을 원하십니까? – kirqe

+0

어쩌면 당신은'has_many : links_to'와'has_many : links_from'와 같은'has_many' 세트에 대해 작업 할 수 있습니다. 그리고 지금 당신이하고있는 일을 더 많거나 적게합니까? – Albin

답변

-1

페이스 북과 같은 응용 프로그램에서 "우정"과 같은 문제가 있다고 생각합니다. 한 사용자가 다른 사용자를 따라 다니고 둘 다 서로 따라 다니는 친구 인 것입니다. 나는 전에 이것을 가지고 있었고 나는 우정의 식탁에 참여하여 그것을 해결했다. 그것은 상호 우정을 나누게 될 것이다. 차이점은 방향에 관계없이 연결이 항상 존재하지만, 일반적으로 이전에 직면했던 것과 동일한 문제가 있음을 알 수 있습니다. 나의 제안은 다음과 같습니다

  1. 링크를 생성, 항상 그들에게 bothways를 작성, Link.new (endpoint1_id : city_1_id, endpoint2_id : city_2_id) Link.new (endpoint2_id : city_1_id는 endpoint1_id : city_2_id)

  2. def connections # find your cities, where connections run both ways 
    City.find_by_sql " 
    select * from cities 
        where id in 
        (select f2.endpoint1_id from links as f1 inner join links as f2 on (f1.endpoint1_id = f2.endpoint2_id) and (f1.endpoint2_id = f2.endpoint1_id) and (f1.endpoint1_id = #{id.to_i}))" # normally this can cause an sql injection, but here it is handled by to_i 
    end 
    
,536,913 :
  • 그러던 어느 도시에서 오는 연결에서 검색 할 때, 다음과 같이 도시 및 링크에서 선택하여 SQL 문을

    이 해결 방법은이 문제에 대해 최적이 아닐 수 있지만, 같은 방식으로 단방향 연결을 처리 할 수 ​​있으므로이 방법이 훨씬 더 유연합니다.

  • 관련 문제