2009-08-11 3 views
1

나는 블로그를 만드는 중입니다. 몇 가지 유형의 항목 (흥미로운 사이트에 대한 링크 + 간단한 설명, 제목 및 본문 텍스트가있는 전통적인 블로그 게시물, 그림 ... 아이디어를 얻을 수 있음)이 있습니다.Rails 2.3의 외래 키 및 다중 모델 양식 - 버그 또는 기능?

아이디어는 곧은 것 같았다. 그 모든 유형 (생성 시간과 작은 티저/미리보기 텍스트 또는 무언가)에 공통적 인 몇 가지 세부 사항이있는 엔트리 테이블/모델, 그리고 각 엔트리 유형에 대한 표/모델은 엔트리 테이블/모델.

2.3의 새로운 멀티 모델 폼에 대해 this great tutorial에 따라 앱을 설정했습니다.

class Link < ActiveRecord::Base 
    has_one :entry 
    accepts_nested_attributes_for :entry 
    attr_accessible :url, :description, :title, :entry_attributes 

end 

class Entry < ActiveRecord::Base 
    belongs_to :link, :dependent => :destroy #adding more types later 

end 

보낸 사람 Links_Controller.

def new 
    @link = Link.new() 
    @link.build_entry 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @link } 
    end 
    end 

그리고보기 양식 :

<% form_for(@link) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </p> 
    <p> 
    <%= f.label :url %><br /> 
    <%= f.text_field :url %> 
    </p> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </p> 
    <% f.fields_for :entry do |e| %> 
     <%= e.label :teaser %><br /> 
     <%= e.text_field :teaser %> 
     <%= e.text_field(:controller_name, :value => params[:controller].to_s) %> 
     <% end %> 
    <p> 
    <%= f.submit 'Create' %> 

난 그냥 내가 항목을 나열하지만, ​​표시하기에 적합한 컨트롤러를 참조 할 수있는 컨트롤러 이름을 저장하고 새로운 링크 유형 항목을 작성. 작동하는 것처럼 보이지만 (다중 모델 양식이 제출되고 연관된 각 모델의 테이블에 행이 나타남) 외래 키 필드는 모든 항목에 대해 null입니다. 데이터베이스에서 내가 얻을 : 외래 키의 부족은 검색을 어렵게하고있다

mysql> select * from links; 
+----+------------+------------------+---------------------+-------------+ 
| id | entries_id | title   | url     | description | 
+----+------------+------------------+---------------------+-------------+ 
| 10 |  NULL | Snazzy website | www.somewebsite.com | Cool site | 
| 11 |  NULL | Snazzy website | www.somewebsite.com | Cool site | 
| 12 |  NULL | Snazzy website | www.somewebsite.com | Cool site | 
| 13 |  NULL | Snazzy website 2 | www.ab21e312e3c.com | Description | 
| 14 |  NULL | fk_test   | fk_test    | fk_test  | 

mysql> select * from entries; 
+----+-----------------+------------------------+---------------------+--------- 
------------+ 
| id | controller_name | teaser     | created_at   | updated_ 
at   | 
+----+-----------------+------------------------+---------------------+--------- 
------------+ 
| 10 | links   | Check it out   | 2009-08-11 09:06:47 | 2009-08- 
11 09:06:47 | 
| 11 | links   | Check it out   | 2009-08-11 09:08:49 | 2009-08- 
11 09:08:49 | 
| 12 | links   | Check it out   | 2009-08-11 09:09:04 | 2009-08- 
11 09:09:04 | 
| 13 | links   | This is interesting... | 2009-08-11 09:27:29 | 2009-08- 
11 09:27:29 | 
| 14 | links   | fk_test    | 2009-08-11 20:42:26 | 2009-08- 
11 20:42:26 | 
+----+-----------------+------------------------+---------------------+--------- 
------------+ 

, 그것은 보통 FK 값에 의존하기 때문이다. 몇 가지 질문이 나올 :

  1. 나는 DHH는 개념적 모델에 속하는 비즈니스 로직과 같은 DB 제약 떨어져 기록을 알고, 그래서 그 작업하기로 또는 뭔가 잘못을 했는가하는 방법이 무엇입니까?

  2. 항목 테이블과 링크 테이블에서 ID가 동일하다는 사실을 기반으로 데이터를 가져올 방법을 찾아야합니까?

  3. 내가 시도하고있는 것을 수행하는 더 좋은 방법이 있습니까?

답변

2

외래 키가 잘못된 테이블에있는 것 같습니다. belongs_to 연관이있는 모델에는 외래 키가 있어야하므로 entries 테이블의 테이블은 link_id이어야합니다.

1) 그래서 이가, DHH가 개념적 모델에 속한 비즈니스 로직으로 DB 제약 떨어져 쓰는 방법을 알고 그 일을 또는 내가 뭔가 잘못을 했는가 생각?

외래 키를 설정해야 제대로 작동하지 않습니다. 제약 조건이 모델 또는 데이터베이스에 속하는지 여부에 관해서는 양측 모두 좋은 주장을 들었다.

2)는 ID가 이 항목 테이블과 링크 테이블 모두에서 동일하다는 사실에 기초 데이터를 잡아하는 방법을 파악해야 하는가?

은 확실히,이은 동일하게 유지 보장 할 수 없습니다 없습니다. 걸릴 것입니다 모두 한쪽에 더 많은 행을 꽤 혼란을 일으키는 모든 오프셋합니다.

3) 내가 더 을 시도하는 더 좋은 방법이 있습니까?

link_id 열을 entries에 추가하여 사용 가능한지 확인해보십시오.

+0

감사합니다. Ryan! FK에 대해 당신이 옳았어요. 나는 그 관계를 뒤집었다. 일단 나는 쿼리가 더 의미가 만든 문제의 진정한 원인을 밝혀 것을 고정; 내 테이블은 references : entries 대신 entries : entries로 정의되었습니다. 이제 모든 것이 작동합니다! 시간을내어 답변 해 주셔서 감사합니다. 나는 railscasts BTW의 큰 팬이다. 앞으로도 힘써주세요! – mikewilliamson