2012-12-19 3 views
3

몇 가지 조언이 필요합니다. 내가 배울 수있는 조금 복잡한 응용 프로그램을 만들고 있습니다. 그것에는 사용자 모델이 있습니다. 사용자가 가입 한 후에는 모달 대화 상자가 특정 페이지에 처음 액세스 할 때 (그리고 처음으로 표시되는 경우에만) 표시하고 싶습니다. 예를 들어 '투표'페이지와 '설문 조사 만들기'페이지 등이 있습니다.레일 앱에 작업 목록 저장

이러한 유형의 도움말 시스템을 구현하는 가장 좋은 방법은 무엇입니까? 나는 "투표, 생성, 공유"와 같은 값의 기본 목록을 포함 할 수있는 사용자 모델에 열을 추가 할 생각을했습니다. 사용자가 해당 작업 중 하나에 해당하는 페이지에 액세스 할 때 작업의 이름이 목록에 남아 있으면 모달이 나타나고 작업 이름이 목록에서 제거됩니다.

합리적인 소리가 들립니까? 나는 정규화 된 데이터베이스에서 하나의 필드에 여러 값을 저장해서는 안된다는 것을 알고 있습니다. 그러나 사용자를 작업과 관련시키기 위해 "작업"이라는 테이블과 다른 조인 테이블을 만드는 것이 미친 것처럼 보입니다. 사용자가 사이트에서 할 수있는 것은 4 ~ 5 가지뿐입니다.

내가 누락 된 다른 방법이 있습니까? 조언 해 주셔서 미리 감사드립니다.

+1

사용자가 수행 할 수있는 일련의 작업이 완전히 정적이어서 변경되지 않는 경우 제안과 비슷한 방식으로 비정규 화하는 문제를 너무 많이해서는 안됩니다. 그러나 필자는이 열이 MySQL의 ['SET'] (http://dev.mysql.com/doc/en/set.html) 유형 중 하나이거나 다른 열 (하나의 작업 당 하나)을 가짐을 제안합니다. MySQL의'BOOLEAN' 유형. – eggyal

+0

Rails 애플리케이션에서'SET'을 사용하지 마십시오. 그것은 매우 부서지기 쉬우 며 목록에 새로운 가치를 도입하기 위해서는 스키마 변경이 필요합니다. 대형 테이블을 재구성하려면 완료하기 위해 상당한 가동 중단 시간이 필요할 수 있습니다. – tadman

답변

0

이와 같은 특정 동작을 "트리거"하는 데 사용할 수있는 UserTrigger 모델을 만들어야합니다. 그것은 실제로 다음과 같이 보일 것입니다 :

def for_trigger(model, name) 
    if (model.triggers.where(:name => name.to_s).delete_all > 0) 
    yield 
    end 
end 

는 부드러운 버전은 should_trigger?did_trigger! 방법의 하나가 테스트 할 쌍하고있을 것입니다 :

<% for_trigger(@user, :first_time_help) do %> 
...help content... 
<% end %> 

이 방법은 같은 약 정의를 할 것이다 other는 실제로 트리거 레코드를 제거합니다. 이 단일 샷은 대부분의 경우에 충분해야합니다. 당신은 당신의 사용자 모델에서 이러한 트리거 기록 after_create, 또는 그것을 필요로 다른 모델을 미리 입력해야합니다

class User < ActiveRecord::Base 
    has_many :triggers, 
    :class_name => 'UserTrigger' 
end 

class UserTrigger < ActiveRecord::Base 
    belongs_to :user 
end 

:

당신은 같은 약 귀하의 사용자 모델의 정의를 가질 것이다. 방아쇠를 다시 설정하려면 방금 레코드를 다시 추가하십시오.