2015-02-03 2 views
1

두 개의 후속 모델 userevent이 있는데, 현재 하나의 조인 테이블에서 처리됩니다. 사용자를 일정에 초대 할 수 있으며 이러한 초대는 상태가 첨부되어 있습니다. 이것은 다른 조인 테이블에 의해 처리됩니다.조인 테이블의 업데이트 열

user = User.create(name: "bob") 
event = Event.create(title: "super fete") 
user.add_event(e) 
event.add_invitation(e) 

invite = user.invitations.first 
# this returns a reference to the event, with the extra status column from the join table 
# <Event @values={:id=>1, :title=>"fete", :owner_id=>nil, :user_id=>nil, :status=>"pending"}> 
# does not actually save back to the table if I modify it... 
invite[:status] = "accepted" 

어떻게해야 (나는 내가 many_to_many을 설정 한 방법에 의한 있으리라 믿고있어)

class Event < Sequel::Model(:events) 
    many_to_many :users 
    many_to_many :invitations, :join_table => :events_invitations, :right_key => :user_id, :class => :User, :select=>[Sequel.expr(:users).*, :events_invitations__status] 
end 

class User < Sequel::Model(:users) 
    many_to_many :events 
    many_to_many :invitations, :join_table => :events_invitations, :right_key => :event_id, :class => :Event, :select=>[Sequel.expr(:events).*, :events_invitations__status] 
end 

내가 작성하고 관련 초대장에 액세스 할 수 있어요하지만, 변경 사항이 저장되지 않습니다 나는 이것을 모델로하여 사용자 및 이벤트 초대장의 상태를보고 설정할 수 있습니다.

+0

관련 항목 : http://stackoverflow.com/questions/15672918/sequel-accessing-many-to-many-join-table-when-adding-association – Phrogz

+0

다른 질문으로 답변을 만들었습니다. https : // stackoverflow .com/a/48139189/676874 여기서'add_invittion'에 추가 매개 변수를 추가하기 위해 many_to_many-relation을 어떻게 적용 할 수 있는지 볼 수 있습니다. 그러나 데이터를 얻으려면 모델이 필요합니다. – knut

답변

1

먼저, 일부 (궁극적으로 도움이되지 않는) 기본 사항.

후속 읽기 전용 값을 저장할 수있는 한 후속 모델은 해시처럼 모델을 처리하게합니다. 그러나 Sequel의 해시가 데이터 세트에서 반환 된 것처럼 키를 설정해도 해시가 업데이트되지는 않습니다. 예를 들어 :

bob = DB[:users][name:'Bob'] #=> {:id=>1, :name=>"Bob"} 
bob[:name] = 'Mary' 
p bob       #=> {:id=>1, :name=>"Mary"} 
p DB[:users][1]    #=> {:id=>1, :name=>"Bob"} 

이뿐만 아니라 모델의 경우도 마찬가지입니다 : 데이터 집합에 대한

bob = User[name:'Bob'] #=> #<User @values={:id=>1, :name=>"Bob"}> 
bob[:name] = 'Mary' 
p bob     #=> #<User @values={:id=>1, :name=>"Mary"}> 
p User[1]    #=> #<User @values={:id=>1, :name=>"Bob"}> 
bob.name = 'Jerome' 
p bob     #=> #<User @values={:id=>1, :name=>"Jerome"}> 
p User[1]    #=> #<User @values={:id=>1, :name=>"Bob"}> 

, 당신은 데이터베이스에서 값을 변경하여 데이터 집합을 update해야합니다. 모델에 대한

, 당신은 위와 같이 값을 업데이트하는 중 필요하고 save하여 해당 모델 인스턴스 (예를 들어, bob.save)을 변경하거나 새 값 (예를 들어, bob.update name:'Mary')와 update에 인스턴스를 사용해야합니다.


하지만 실제로는, 당신이 Event과 같은 일을 할 수 many_to_manyclassselect 값을 남용되지만이 아니다. 20 명을 초대하면, 20 가지 "이벤트"가 모두 "슈퍼 팻 (super fete)"이지만 상황이 다릅니다. 그것들은 사건이 아니며 초대장입니다.

Invitation 모델이 조인 테이블과 연관된 조인을 나타 내기를 원합니다. 그런 다음 status이있는 인스턴스를 가져올 수 있으며 원하는 경우 update 수 있습니다. 메시지가 표시 될 때 events_invitations 테이블 또는 status 열에 대해 알지 못하기 때문에 Event 인스턴스에서 update을 가져올 수 없습니다.

+0

그건 완전히 이해가됩니다; 조인 테이블 모델이 훨씬 자연 스럽습니다. 나는 Sequel 연관성의 측면에서 그 모델 내에서 관계를 정확히 표현하는 방법으로 여전히 고심하고있다. 문제의 업데이트를 다루는 것이 너무 많으면 다른 질문을 할 수 있습니다. –

관련 문제