2

안녕하세요, Rails 멍청한 놈이 아니지만 이것이 나를 곤란하게 만들었습니다. With에는 Rails에 많은 연관성이 있습니다. 나는 와인리스트에 와인리스트에 와인을 할당 할 때 이런 식으로 테이블을 보냅니다.has_many : 대량 협회에서 협회의 메타 데이터를 날려 버림으로써

class WineBarController 

    def update 

    @winebar = WineBar.find(params[:id]) 

    @winebar.wines = Wine.find(params[:wine_bar][:wine_ids].split(",")) // Mass assign wines. 

    render (@winebar.update_attributes(params[:wine_bar]) ? :update_success : :update_failure) 

    end 

end 

이렇게하면 해당 와인 바와 관련된 모든 와인리스트 행이 삭제됩니다. 그런 다음 wine_ids의 모든 와인을 찾습니다. 와인 ID는 쉼표로 구분 된 문자열입니다. 그런 다음 winelist에 새 연결을 삽입합니다. 비싸지 만 파괴 된 협회 행에 유리와 병당 개별 와인 바 가격과 같은 메타 데이터가없는 경우에는 문제가되지 않습니다.

모든 것을 날려 버리지 않고 배열을 열거 할 수있는 비교를 수행하고 변경 사항을 삽입하는 방법이 있습니까? 레일스처럼 뭔가있는 것 같아요. 나는 분명히 뭔가 빠져 있습니다.

감사합니다.

답변

2

기존의 레코드를로드하고 업데이트하는 대신 새로운 와인 바 레코드를 만드는 것이 문제입니다. 그래서 당신이 기록을 검토 할 때, 그 관계를 보여주는 것은 아무것도 없습니다. Rails 으로 목록의 모든 레코드를 삭제하거나 만들지 않을 정도로 똑똑하기 때문에 걱정하지 마십시오.

당신이 당신의 양식에 대한 표준 레일 설치 사용하는 경우 :

<% form_for @wine_bar do |f| %> 

그런 다음이처럼 업데이 트를 호출 할 수 있습니다 :

class WineBarController 
    def update 
    @winebar = WineBar.find(params[:id]) 
    render (@winebar.update_attributes(params[:wine_bar]) ? :update_success : :update_failure) 
    end 
end 

당신은 명시 적으로 레코드를 업데이트 할 필요가 없습니다 params[:wine_bar][:wine_ids]으로 변경했습니다. params[:wine_bar]으로 업데이트하면 wine_ids가 그 일부로 포함 되었기 때문입니다. 이게 도움이 되길 바란다!

업데이트 : 양식을 설정하는 방법 때문에이 기능이 작동하지 않지만 사용자가 쉽게 수정할 수 있다고 언급했습니다. 양식에서 입력 필드의 이름을 wine_bar[wine_ids]에서 wine_bar[wine_ids_string]으로 바꿉니다. 그럼 당신은 너무 같은 모델의 접근을 작성해야합니다 : "수완"

class WineBar < ActiveRecord::Base 
    def wine_ids_string 
    wines.map(&:id).join(',') 
    end 

    def wine_ids_string= id_string 
    self.wine_ids = id_string.split(/,/) 
    end 
end 

첫 번째 방법은 위에있는이 - 그것은 관련된 와인 ID의 목록을 받아 문자열로 변환 그 형태가 할 수 용도. 다음 메서드는 "setter"이며 쉼표로 구분 된 ID 문자열을 받아 들여 wine_ids=이 수락하는 배열로 나눕니다.

내 기사 Dynamic Form Elements in Rails, 레일 입력 양식이 데이터베이스 레코드의 속성으로 제한되지 않는 방법을 설명합니다. 모든 접근 자 메서드 쌍을 사용할 수 있습니다.

+0

답장을 보내 주셔서 감사하지만 작동하지 않습니다. wine_ids 필드는 중첩 된 형식이 아닙니다. 그것은 문자열입니다. 내 UI가 중첩 된 양식 규칙과 잘 맞지 않습니다. 내 예를 업데이트로 업데이트했습니다. 이런. 와인 ID를 쿼리 한 다음 와인 바에 연결하기위한 추가 단계가 필요합니다. –

+0

안녕하세요. 로렌스 - 대답을 업데이트했습니다. 도움이되는지 알려주세요. –

관련 문제