2015-01-27 2 views
1

가정을 테이블의 필드에 기초하여 가입 :필터 후편 many_to_many 관계

  • Sequel documentation의 many_to_many 부에 정의 된 연관 many_to_many; artists --<albums_artists>-- albums
  • albums_artists

가 어떻게이 WHERE 절에 albums_artists 테이블에 필드에 액세스 않는 foo 필드가? 이 구문은 작동하지 않습니다

<% @artist.albums_dataset.where(:foo => 'bar').each do |album| %> 
    ... 
    <%= album[:foo] %> 
    ... 
<% end %> 

내가 album_artists에 대한 모델을 추가한다면, 나는 기존 many_to_many 연결을 제거 것, 그 과정에서 두 개의 연결을 생성?

+0

, 일부 데이터베이스에 대한 귀하의 구문 (예를 들어 sqlite3를) 잘 작업을 수행합니다. 다음 번에는 (a) 사용중인 RDBMS와 (b) 정확히 어떤 오류가 있는지 언급 할 수 있습니다. ("작동하지 않습니다"는 분명하지 않습니다.) – Phrogz

답변

0

:tablename__columnname (밑줄 두 개) 구문을 사용하여 액세스 할 열에 대해 qualify the table name이 필요합니다. 여기

@artist.albums_dataset.filter(:albums_artists__foo => "bar").each do |album| 

또한 생성 된 SQL을 보여주는 테스트입니다 : BTW

require 'sequel'; DB = Sequel.sqlite 
DB.create_table(:artists){ primary_key :id; String :name } 
DB.create_table(:albums){ primary_key :id; String :name } 
DB.create_table(:albums_artists) do 
    String :foo 
    foreign_key :artist_id, :artists 
    foreign_key :album_id, :albums 
    primary_key [:artist_id, :album_id] 
end 

class Artist < Sequel::Model; many_to_many :albums; end 
class Album < Sequel::Model; many_to_many :artists; end 

Artist.multi_insert [ {name:"Bob"}, {name:"Dylan"}, {name:"Joni"} ] 
Album.multi_insert [ {name:"BobSolo"}, {name:"JoniSolo"}, 
        {name:"BobJoni"}, {name:"BobDylan"}, 
        {name:"BobJoniDylan"} ] 

# If the album name includes the artist, add them to it. 
Artist.each do |ar| Album.each do |al| 
    if al.name.include?(ar.name) 
    DB[:albums_artists] << {artist_id:ar.id, album_id:al.id} 
    end 
end end 

bob.albums.map(&:name) 
#=> ["BobSolo", "BobJoni", "BobDylan", "BobJoniDylan"] 

bob.albums_dataset.filter(albums_artists__foo:"bar").sql 
#=> SELECT `albums`.* 
#=> FROM `albums` INNER JOIN `albums_artists` 
#=> ON (`albums_artists`.`album_id` = `albums`.`id`) 
#=> WHERE ((`albums_artists`.`artist_id` = 1) 
#=>  AND (`albums_artists`.`foo` = 'bar')) 

bob.albums_dataset.filter(albums_artists__foo:"bar").all 
#=> [#<Album @values={:id=>5, :name=>"BobJoniDylan"}>] 
관련 문제