2009-09-02 5 views
1

Map 모델이 있는데,이 모델은 머드의 특정 영역에 대한 ASCII 아트지도의 세부 정보를 정의합니다. ID 대신 이름을 사용하여 각지도의 페이지에 접근 할 수 있기를 원하므로 Western Ithmia의지도가 있다면 /maps/western_ithmia (또는 /maps/withmia)에서 액세스 할 수 있기를 원합니다.두 개의 관련 Rails 모델을 동시에 만들어야합니다.

두 번째 모델 MapAlias에지도에 도달하기 위해 경로에 사용할 수있는 기존의 모든 짧은 이름이 포함되어 있습니다. 외래 키는 각 별칭과 함께 저장되어 해당 Map의 ID를 나타냅니다.

내가하고 싶은 일은 새로 만든 Map과 동시에 새로 MapAlias을 새로 만듭니다. 안타깝게도 새로운 Map의 ID가 저장 될 때까지는 그럴 수없는 것처럼 보이지만 새로운 MapAlias을 확인/저장하기 전에는 저장하지 않으려 고합니다. 이 점을 악화시키는 이유는 각 MapAlias이 기본 별칭인지, 즉 링크가 생성 된 별칭인지를 각자 Map에게 알리고 싶다는 것입니다. 이것은 내게 순환 종속성처럼 보입니다 ...

저는 레일스에서 ​​아직 익숙하지 않아서 무엇을해야하는지 확신 할 수 없지만 (before_save와 같은) 모델 콜백 훅을 탐구했습니다 제한된 성공 - 나는 여전히 대응할 순환 의존성을 가지고있다. 어떤 아이디어? =/

답변

0

좋아, 시간의 공정한 조금 후에, 나는 생각을 해결책을 찾아야한다. 이 질문을 썼을 때, Map has_many MapAlias'es, 각 MapAlias가 Map에 속합니다. 나는 최근에 내가 원했던 것이 또 다른 연관성이라는 것을 깨달았다. 웹 사이트가 그 맵에 대한 링크로 사용하는 기본 이름 인 맵이 속한다. 별표를 설정/생성하기 위해 두 개의 before_validation_on_ *, 원래 연결에 대한 별칭의 map_id 외래 키를 설정하기 위해 after_create를 추가하여 세 개의 후크를 추가했습니다. 또한 매력처럼 작동합니다.

컨트롤러에 그냥지도 일뿐입니다.저장 호출을 사용하지만 내부적으로 먼저 별칭이 저장됩니다.

belongs_to :shortname, :class_name => "MapAlias" # primary name 

before_validation_on_create :add_map_alias 
def add_map_alias 
    self.create_shortname(:title => self.title) 

    @alias_failed = !(self.shortname.errors.empty?) 

    nil 
end 

before_validation_on_update :set_map_alias 
def set_map_alias 
    self.shortname.title = self.title 
    self.shortname.save(false) 

    @alias_failed = !(self.shortname.errors.empty?) 

    nil 
end 

after_create :set_alias_map_id 
def set_alias_map_id 
    self.shortname.update_attribute :map_id, self.id 

    nil 
end 

아마도 가장 이상적인 해결책은 아니지만 실제로는 별 문제가되지 않습니다. 모든 사람의 조언을 주셔서 감사합니다.

1

은 데이터베이스 트랜잭션에서 모든 랩 :

Map.transaction do 
    # ... save all your stuff ... 
end 

데이터베이스가가에서 좋은 일을하자 ... 콜백으로 다시 구현 거래하지 마십시오. 그것은 모두 구원받을 것이고, 그것들 중 아무 것도 구원을 얻지 못할 것입니다.

0

일반적으로 내가 수행하는 작업은 수동으로 동시에 두 모델을 생성하는 것입니다. 즉, 두 가지 모델 인 Cause and Effect가있는 경우 원인을 생성 할 수있는 모든 방법 (일반적으로 컨트롤러에서)을 만들고 원인이 생성되면 통과하는 Effect를 만드는 선을 포함시킵니다. 원인으로부터 .. 적절한 매개 변수. 그런 식으로 저장되지 않은 경우에도 ID에 액세스 할 수 있습니다 (개체가 메서드에 여전히 저장되어 있어도 여전히 저장되어 있기 때문에).

before_save 메소드처럼 자동으로 실행되지는 않지만, 어떤 일이 발생했는지, 언제, 이전/이후 메소드에 뿌리 내리지 않고 볼 수있는 것이 좋을 것 같습니다.

0

html 양식을 통해이 작업을 수행하려는 경우 컨트롤러의 새 Map 인스턴스에서 build으로 전화 할 수 있습니다.


# maps_controller.rb 
def new 
    @map = Map.new 
    @map_alias = @map.map_aliases.build 
end 

는 (가상 속성을 생성) 그것에 조금 더있다, 그러나 당신은 몇 가지 아이디어에 대해이 스크린 캐스트를 살펴 수행 할 수 있습니다 이 http://railscasts.com/episodes/75-complex-forms-part-3

관련 문제