2013-03-28 3 views
3

저는 Sequel을 사용하여 위시리스트 시스템을 구축하고 있습니다. 나는 wishlistsitems 테이블과 items_wishlists 조인 테이블 (그 이름은 속편 선택)입니다. items_wishlists 테이블에는 NOT NULL 열인 facebook id에 대한 추가 열 (opengraph 작업을 저장할 수 있음)이 있습니다.연관을 추가 할 때 many_to_many 조인 테이블에 액세스하는 후속

나는 또한 WishlistItem의 속편 many_to_many association이 설정된 모델이 있습니다. Wishlist 클래스에는 select: [:items.*, :items_wishlists__facebook_action_id]으로 설정된 many_to_many 연결의 :select 옵션이 있습니다.

wishlist.add_item my_item, facebook_action_id: 'xxxx' 같은 것을 만들 때 추가 데이터를 추가 할 수있는 방법이 있습니까? 페이스 북 ID가 열에 NULL이 아니기 때문에 연관을 생성 한 후에는 그것을 수행 할 수 없습니다. 어떤 도움

답변

6

이 작업을 수행하기 위해 권장되는 방법에 대한

덕분에 조인 테이블에 대한 모델을 추가하는 것입니다. 그러나 원하지 않는 경우 다음을 수행 할 수 있습니다.

class Wishlist 
    def _add_item(item, hash={}) 
    model.db[:items_wishlists].insert(hash.merge(:item_id=>item.id, :wishlist_id=>id)) 
    end 
end 
+0

감사합니다. Jeremy. 조인 테이블에 대한 모델을 만든 경우 관계를 설정하여'wishlist.items'를 할 수 있습니까? 또한 목록과 항목을 연관 시키려고 할 때 조인 모델의 인스턴스를 만들 것이라고 가정합니다. 제가 맞습니까? –

0

다른 가능성이 있다고 생각합니다.

require 'sequel' 
Sequel.extension :pretty_table 
Sequel::PrettyTable.print()/Sequel::PrettyTable.string() 

DB = Sequel.sqlite 
DB.create_table(:wishlists){ 
     primary_key :id 
     String :listname 
} 
DB.create_table(:items){ 
     primary_key :id 
     String :descr 
    } 
DB.create_table(:items_wishlists){ 
     primary_key :id 
     foreign_key :wishlist_id, :wishlists 
     foreign_key :item_id, :items 

     add_column :facebook_id, type: :nvarchar 
} 

class Item < Sequel::Model 
    #~ many_to_many :wishlists 
end 

class Wishlist < Sequel::Model 
    many_to_many :items, 
       join_table: :items_wishlists, class: Item, 
       left_key: :wishlist_id, right_key: :item_id, 
       adder: (lambda do |item, facebook_id: nil| 
         self.db[:items_wishlists].insert(wishlist_id: self.id, item_id: item.id, facebook_id: facebook_id) 
       end) 
end 

w1 = Wishlist.create(listname: 'list1') 
w1.add_item(Item.create(descr: 'item 1')) 
w1.add_item(Item.create(descr: 'item 2'), facebook_id: 'fb2') 

Sequel::PrettyTable.print(DB[:items_wishlists]) 

:

require 'sequel' 
    Sequel.extension :pretty_table #Sequel::PrettyTable.print()/Sequel::PrettyTable.string() 

    DB = Sequel.sqlite 
    DB.create_table(:wishlists){ 
     primary_key :id 
     String :listname 
    } 
    DB.create_table(:items){ 
     primary_key :id 
     String :descr 
    } 
    DB.create_table(:items_wishlists){ 
     primary_key :id 
     foreign_key :wishlist_id, :wishlists 
     foreign_key :item_id, :items 

     add_column :facebook_id, type: :nvarchar 
    } 

    class Item < Sequel::Model 
    many_to_many :wishlists 
    end 

    class Wishlist < Sequel::Model 
    many_to_many :items 
    end 

    w1 = Wishlist.create(listname: 'list1') 
    w1.add_item(Item.create(descr: 'item 1')) 
    #w1.add_item(Item.create(descr: 'item 2'), facebook_id: 'fb2') ##<- This does not work 

    #Sequel::PrettyTable.print(Wishlist) 
    #Sequel::PrettyTable.print(Item) 
    Sequel::PrettyTable.print(DB[:items_wishlists]) 

이 매개 변수 (Wishlist#add_item(Item.create(descr: 'item 2'), facebook_id: 'fb2'))이 예에서와 같이 adder를 정의해야와 ad_item을 허용하려면 다음

먼저 MWE 질문의 (최소한의 작업 예) 결과 :

+-----------+--+-------+-----------+ 
|facebook_id|id|item_id|wishlist_id| 
+-----------+--+-------+-----------+ 
|   | 1|  1|   1| 
|fb2  | 2|  2|   1| 
+-----------+--+-------+-----------+ 

하지만 nex 나중에 문제가 발생합니다 :

w1.items을 사용하면 항목 목록이 표시되지만 매개 변수에 액세스 할 수는 없습니다. (적어도 지금까지는 아무런 방법도 찾지 못했습니다. 아직 연구 중입니다.하지만 Jeremys 권장 사항을 참조하십시오.)