2014-08-08 2 views
2

저는 프로젝트를 만들고 있는데 가능한 최선의 방법으로 데이터베이스를 구성하려고합니다. 나는 한 달 (즉 8 월)에 속하며 범주 (즉 야구)에 속하며 사용자 (즉, current_user)에 속하는 단일 이벤트 (야구 게임을 생각하는)를 원합니다.이 모델/DB assiociations를 구성하는 가장 좋은 방법은 무엇입니까

다른 말로하면 한 달, 범주 및 사용자에게 많은 이벤트를 제공하고 싶지만 이벤트가 복제되는 것을 원하지는 않습니다.

august.events.find_by_id(1) 
baseball.events.find_by_id(1) 
current_user.events.find_by_id(1) 

모든 팁 : 같은 이벤트 객체에 의해 반환 될 것인가? 나의 초기 생각은 내가 전술 한 바와 같이 단지 관계를 설정하는 것입니다 ..하지만 난 이후 이벤트 객체 만드는 가장 좋은 방법이 무엇인지에 궁금 : 때 나는

august.events.new("foo") 
baseball.events.new("foo") 
current_user.events.new("foo") 

모든 세 가지 이벤트 객체를 얻을 것을 단지 하나를 만들려고합니다.

이렇게 할 수 있습니까?

Event.new(:category => "baseball", :month => "august") 

는 사용자를 선언하는 가장 좋은 방법 일 것입니다 무슨 "이 그"같은 baseball.events.all 및 august.events.all 같은 명령이 실행 이벤트 및에서. 그리고 카테고리 -> 스포츠 -> 야구 -> 이벤트를 원한다면 어떻게 협회 광기에 깊이 빠져들 수 있습니까?

도움을 주셔서 감사합니다.

답변

0

이 답변 자체는 아닙니다. 이는 주로 API의 유연성에 대한 아이디어를 제공하기위한 것입니다.


내가 말할 수있는 것과 스키마는 올바른 것입니다. Eventmonthcategory (또는 category_id) 및 user_id입니다. 해당 모델에서 작동하는 모든 방법의 도우미 메서드를 만들 수 있습니다. 몇 가지 범위로 예를 들어

:

class Event 
    scope :for_month, ->(m) { where(month: m) } 
    scope :for_category, ->(c) { where(category: c) } 
    scope :for_user,  ->(u) { where(user: u) } 
end 

# usage 

Event.for_month("august").for_category("baseball").for_user(current_user) 

# below, month "august" will be set on instance 
current_user.events.for_month("august").new("foo") 

그러나이 모든 것은 무의미하다. 대신에 그 관계로, 당신은 User 또는 Category에서 Event에 액세스 할 수 있으며 세부 사항에 자신을 채우기 :이 데이터에 액세스하고 조작 할 수있는 방법의 톤이있다

Event.where(month: "august", category: "baseball", user: current_user) 
current_user.events.where(month: "august", category: "baseball") 

current_user.events.new(month: "august", category: "baseball") 

. 위보다 훨씬 더 줄일 수 있을지 확신하지 못합니다. 당신은 미쳐 가서 여러 인자를 가진 범위를 추가 할 수 있습니다 :

class Event 
    scope :for_mcu, ->(m, c, u) { 
    for_month(m).for_category(c).for_user(u) 
    } 
end 

# usage 

Event.for_mcu("august", "baseball", current_user) 
+0

Ok 대단히 감사드립니다. 네, 최선의 관행이 무엇인지보고 싶었습니다. 스키마가있는 경우이를 볼 수있는 방법이 많았지 만 스키마와 관련된 사전 정의 된 레일 관계가 아닌 것 같습니다. – jimmycouch

+0

@ user3325383 그게 다예요. 루비에서 똑같은 것을 달성 할 수있는 많은 방법이 있습니다. 쿼리 메서드에는 초점을 두지 않고 아래에는 스키마 (열 등)를 사용하십시오. 그 권리를 얻으십시오, 나머지는 제자리에 떨어질 것입니다. –

관련 문제