2013-12-21 3 views
0

그래서 네 개의 데이터베이스 테이블이 있습니다.레일에 조인 테이블에 추가

사용자 (이름 등) 조리법 (이름 : 설명 : USER_ID 등), 스크랩북 (이름 : 설명 : USER_ID)과 Scrapbook_Entry (: USER_ID,에는 Recipe_ID : scrapbook_id)

사용자, 조리법 및 스크랩북 테이블을 채울 수는 있지만 지금 내가하고 싶은 일은 스크랩북에 요리법을 저장하는 옵션이 있습니다. 이렇게하면 모델을 만든 Scrapbook_Entry 테이블을 채울 필요가 있습니다.

Scrapbook_Entry 모델 :

has_one :recipe 
has_one :scrapbook 

레시피 모델 :

has_many :scrapbooks, through: :scrapbook_entries 

방명록 모델

has_many :recipes, through: :scrapbook_entries 

사용자 모델

has_many :recipes, dependent: :destroy 
has_many :scrapbooks, dependent: :destroy 

레서피보기에서 양식을 작성하여 스크랩북을 선택하여 레서피를 저장하고 Scrapbook_Entry 테이블을 제출하고 채울 수있게하고 싶습니다.

내 질문 : 내 scrapbook_entries에 대한 새 컨트롤러를 만들고 그 안에 create 메소드가 있어야합니까, 아니면 내가 레시피 컨트롤러를 사용할 수 있습니까?

나는 레일을 처음 사용하기 때문에 아직 모든 것을 파악하려고 노력하고 있습니다. 고맙습니다!

+0

문제가 무엇인지 알려주지 않았습니다. 네가 가진 것과 네가하고 싶은 일. –

+0

사과! 좀 더 구체적인가요? 수정 사항을 추가했습니다. – MikeHolford

답변

0

이 경우 새 컨트롤러가 필요하지 않습니다. 당신은 당신이 그것을에 Recipe 객체와 @recipe 변수, 그리고에 Scrapbook 객체와 @scrapbook 변수가 가정

@recipe.scrapbook_entries.build(scrapbook: @scrapbook) 

의 라인을 따라 뭔가를 할 수 있어야합니다.

+0

브릴리언트 덕분에, 고맙습니다. – MikeHolford

+0

이 방법은 create 메소드의 recipes 컨트롤러에 넣으시겠습니까? – MikeHolford

+0

레서피를 생성하자마자 연결하면 yes입니다. 그러나 꼭 그렇게 할 필요는 없습니다. –

0

이것은 (귀하의 경우, ScrapBookEntry)는 "중첩 된 모델"을 취한다는 것입니다 accepts_nested_attributes_for

작동 방법에 대한 작업 같은 소리하고 (상위 모델에서 직접 데이터를 전송할 수 있습니다 Recipe). 그것은 학습 곡선을 가지고 있지만, 모듈 많은 데이터를 처리 시작할 때 특히 유용에 오는 것


는 중첩이 great RailsCast on this subject here

enter image description here

있다

속성을 수용 부모 모델의 컨트롤러를 통해 중첩 모델에 대한 ActiveRecord 객체를 작성하여 Rails가 두 객체를 채울 수 있도록합니다 암탉이 양식이 제출됩니다.이것은 당신이 원하는대로 당신이 효율적인 코드를 유지


코드

대신의 새로운 컨트롤러를 만드는 동안 당신의 중첩 된 모델에 많은 데이터를 추가 할 수 있다는 것을 의미합니다, 당신은 모두를 처리 할 수 ​​있어야합니다 다음과 같이 Recipes 컨트롤러에서 처리 중입니다.

#app/models/recipe.rb 
Class Recipe < ActiveRecord::Base 
    accepts_nested_attributes_for :scrapbook_entries 
end 

#app/controllers/recipes_controller.rb 
def new 
    @recipe = Recipe.new 
    @recipe.scrapbook_entries.build #-> repeat for number of fields you want 
end 

def create 
    @recipe = Recipe.new(recipe_params) 
    @recipe.save 
end 

private 
def recipe_params 
    params.require(:recipe).permit(:recipe, :params, scrapbook_entries_attributes: [:extra, :data, :you, :want, :to, :save]) 
end 

#app/views/recipes/new.html.erb 
<%= form_for @recipe do |f| %> 
    <%= f.text_field :example_field %> 
    <%= f.fields_for :scrapbook_entries do |s| %> 
     <%= f.text_field :extra_data %> 
    <% end %> 
<% end %> 
+0

이 모든 정보를 제공해 주셔서 감사합니다. 레시피와 스크랩북 데이터가 이미 존재하고 폼을 사용하여 기존 데이터로 Scrapbook_entry 테이블을 채우고 싶다면 여전히 동일한 작업을 수행 할 수 있습니까? – MikeHolford

+0

물론 - 비슷한 것을 사용합니다. 새로운 메시지를 만들고 구독자를 추가 할 수있는 뉴스 레터 앱이 있습니다. subs_have_는 이미 존재하며, 우리는 단지 그것을 선택하기 위해'select' 양식 요소를 사용합니다. –

+0

제가 제안한 방식은 데이터를 조인 모델에만 전송하기 때문에 이것은 잘 작동합니다. 우리는 조인 모델을 통해 새로운 요소를 생성하는 방법을 연구하는 데 어려움을 겪었고 조인 모델을 사용하기를 원한다면 조인 내에 다른 accepts_nested_attributes_for를 포함시켜야합니다. –

관련 문제