2009-09-18 5 views
2

내 RoR 애플리케이션의 일부가 웹 사이트 디자인 포트폴리오를 관리합니다. 하나의 웹 사이트 디자인에는 많은 이미지가 연관 될 수 있습니다. 하나의 이미지는 하나의 디자인에만 연결할 수 있습니다. has_many 문을 : through 매개 변수와 함께 사용하여 join 테이블을 통해 디자인과 이미지를 연결합니다. 그리고 이미지가 삭제되면 결합 테이블의 관련 항목을 삭제해야합니다. site_designs를 들어레일 조인 테이블 문제

class Image < ActiveRecord::Base 
    has_one :images_site_designs , :class_name => "ImagesSiteDesigns" , :dependent => :destroy 
    has_one :site_design , :through => :images_site_designs 
end 

:

class SiteDesign < ActiveRecord::Base 
    belongs_to :client 
    has_many :images_site_designs , :class_name => "ImagesSiteDesigns" 
    has_many :images , :through => :images_site_designs 
end 

그리고 가입 테이블 images_site_designs : site_designs에 대한 새로운 이미지를 만들기

class ImagesSiteDesigns < ActiveRecord::Base 
    belongs_to :image 
    belongs_to :site_design 
end 

그래서 코드 작품을 folowing, 괜찮 그래서 난 다음 모델 이미지의 경우 이 세부 사항 :

@site_design = SiteDesign.find(params[:id]) 
    @site_design.images << Image.new(params[:image]) 

하지만 난이 이미지를 다음 오류를 삭제하려고하면 나타납니다

ActiveRecord::StatementInvalid in ImagesController#destroy 

Mysql::Error: Unknown column 'id' in 'where clause': DELETE FROM `images_site_designs` WHERE `id` = NULL 

레일 images_site_designs 쿼리에 대한 잘못된 열 이름을 사용하는 것 같다 테이블을 가입 할 수 있습니다. 어떻게 해결할 수 있습니까?

UPD :

image_controller 기능 이미지 삭제 :

def destroy 
    @image = Image.find(params[:id]) 
    @image.destroy 

    respond_to do |format| 
     format.html { redirect_to(images_url) } 
     format.xml { head :ok } 
    end 
    end 

마이그레이션 :

class CreateImages < ActiveRecord::Migration 
    def self.up 
    create_table :images do |t| 
     t.string :url 
     t.string :name 
     t.text :description 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :images 
    end 
end 
class CreateSiteDesigns < ActiveRecord::Migration 
    def self.up 
    create_table :site_designs do |t| 
     t.string :name 
     t.text :concept 
     t.text :description 
     t.integer :client_id 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :site_designs 
    end 
end 

class CreateImagesSiteDesigns < ActiveRecord::Migration 
    def self.up 
    create_table :images_site_designs , :id => false do |t| 
     t.integer :image_id 
     t.integer :site_design_id 
    end 
    end 

    def self.down 
    drop_table :images_site_designs 
    end 
end 

답변

1

정말 귀하의 질문에 대답 할 수 없습니다. 아마도 Image 인스턴스에서 destroy를 호출했지만 확실하지는 않습니다.

그러나 어쨌든 조인 모델이 필요하지는 않습니다.

class SiteDesign < ActiveRecord::Base 
    belongs_to :client 
    has_many :images 
end 

class Image < ActiveRecord::Base 
    belongs_to :site_design 
end 

는 물론, 이것은 마이그레이션 (드롭 테이블에 가입하고 이미지 테이블에 site_design_id 추가) 필요하지만, 청소기 솔루션처럼 보인다 : 요구 사항은 다음에 의해 충족 될 것으로 보인다. 이 일을하지 않는 이유는 무엇입니까?

+0

게시물에 마이 그 레이션 및 컨트롤러 기능 코드가 추가되었습니다. 미래에 나는 갤러리와 같은 다른 것들을 이미지에 연결하여 이미지 테이블의 구조를 명확하게해야한다. – ebsbk

+0

앞으로의 미래에 대한 걱정. 문제를 해결하십시오. – hgmnz

+0

지금 마이그레이션을 살펴보면서, 조인 모델에 대해 id => false라고 말합니다. id => false를 사용하면 타임 스탬프가없는 순수한 조인 모델이어야합니다 (단 두 개의 열/참조). 다음을 제거하십시오. id => false 및 코드가 작동해야합니다. 그렇지 않으면 has_many : through 대신 has_and_belongs_to_many를 사용하십시오. – hgmnz

0

당신은 하나 개의 이미지가 하나의 디자인과 연관 될 수있는 이유는 다음 사용하려는 경우를 a has_and_belongs_to relationship (당신은 : m 테이블을 사용합니다!)

I wou 다음 LD의 리팩터링 :

:

1) 드롭)을 ImagesSiteDesigns 마이그레이션

drop_table :images_site_designs 

3

)로 모델을 변경 당신의 이미지 모델을 마이그레이션하고 Site_design_id이

class CreateImages < ActiveRecord::Migration 
    def self.up 
    create_table :images do |t| 
     t.string :url 
     t.string :name 
     t.text :description 
     t.integer :site_design_id 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :images 
    end 
end 

2 속성 추가

class SiteDesign < ActiveRecord::Base 
    belongs_to :client 
    has_many :images 
end 

class Image < ActiveRecord::Base 
    belongs_to :site_design 
end 

결국 1 : n 관계로 끝나고 그게 최선의 해결책이 될 것입니다. 귀하의 사양.

당신은 다음과 같은 모델을 액세서 수 있습니다 : 오류를 유발 어떤 코드가 표시되지 않기 때문에

Image.first.site_design 
=> <SiteDesign #id:...> 
SiteDesign.first.image 
=> <Image #id...> 

SiteDesign.image = Image.new(params[:image]) 
... 
+0

게시물에 마이 그 레이션 및 컨트롤러 기능이 추가되었습니다. – ebsbk

+0

어쩌면이게 해결책 이냐구요 – Lichtamberg

+0

고맙습니다.하지만 미래에는 갤러리와 같은 다른 것들을 추가하고 싶습니다. 이미지와 연결되어 많은 관계를 가질 것이므로 이미지 테이블의 구조는 분명해야합니다. . – ebsbk

2

여기서 문제는 image_site_design이 모델이 아니며 (ID 열 없음) 마이그레이션을 수행했지만 그 다음에 ActiveRecord 모델을 만드는 것입니다. 당신이 일하기 위해 무엇을하고 있는지를 알기 위해서는 실제로 조인 테이블에 ID 열이 있어야합니다.

+0

감사합니다. 조인 테이블과 같은 모델을 사용하는 대신 has_and_belongs_to_many 관계를 추가하는 문제를 해결했습니다. – ebsbk