2013-10-12 2 views
2

where 두 가지 조건이있는 where 메서드로 레코드 검색을 수행하려고합니다. 그 중 하나는 nil이어야합니다.레일은 속성이 nil 인 레코드를 찾습니다

레일 4, 루비 2.0.0 및 포스트그레스를 사용하고 있습니다.

저는 User, Drm 및 DrmMorning의 세 가지 모델로 된 앱이 있습니다. 사용자에게는 많은 Drm이 있고 Drm에는 많은 DrmMorn이 있습니다. 하나의 DrmMorning 레코드를 분리하여 편집 할 수 있도록 노력하고 있습니다. 나는 중 하나에 대한 널 값 중 하나는 두 가지 조건을 만족하는 가장 최근의 단일 레코드에 대한 데이터베이스 검색을 수행하려면 어떻게

def update 
    @user = current_user 
    @drm = Drm.where(user_id: @user.id).last 
    @drm_mornings = DrmMorning.where(" drm_id = ? AND location = ?", @drm.id, nil).first || DrmMorning.where(" drm_id = ? AND happy = ?", @drm.id, nil).first 
    if @drm_mornings.nil? 
    flash[:error] = "thanks for finishing up" 
    render 'drm/intro' 
    elsif @drm_mornings.update_attributes(morning_params) 
    redirect_to 'ep_feelings' 
    else 
    flash[:error] = "something is broken" 
    render 'drm/intro' 
    end 
end 

:

내 drm_mornings 컨트롤러의 업데이트 작업입니다 속성?

현재 사용자의 가장 최근 Drm에 대한 첫 번째 불완전한 DrmMorning 레코드를 가져 오는 것이 목적입니다. 이 레코드는 생성 후 두 단계로 편집되므로, nil 인 경우 할당 구조는 nil입니다.

@drm_morning이 비어있는 메서드를 호출 할 때마다 drm/intro에 플래시를 보내서 끝내 주셔서 감사합니다.

해당 레코드를 비워 두어서는 안됩니다.

DrmMorning id: 8, name: "breakfast", begain: "7:00", end: "7:30", drm_id: 3, user_id: 1, created_at: "2013-10-12 20:04:29", updated_at: "2013-10-12 20:04:29", commuting: nil, shopping: nil, housework: nil, other_action_words: nil, other_action: nil, location: nil, interaction: nil, spouse: nil, friend: nil, co_worker: nil, parent: nil, child: nil, client: nil, boss: nil, student: nil, other_person: nil, other_person_words: nil, happy: nil, depressed: nil, angery: nil, enjoy: nil, pain: nil, fatigue: nil, active: nil, person_id: nil 

내가 이것을 읽으면서는 업데이트 작업의 조건을 만족해야한다 : 내가 전화 콘솔에서 DrmMorning.last 나는이 출력을 얻을. 내가 확인하고 current_user 함수가 작동 중이고 다른 곳에서 그 코드로 @drm 변수를 할당 할 수있었습니다. 내가 잘못 사용하고 있습니까?


닐 값을 확인하기위한 구문

레코드의 값 '무'를 검색하는 대신 "ATTRIBUTE = 닐"보다 "ATTRIBUTE IS NULL"이다.

+2

는 답변은 다음 그래서 그것을 확인 추가하지 않습니다 그것은 답이없는 대기열에서 벗어났습니다. s/o에 오신 것을 환영합니다. – dax

+0

감사합니다. 나는 충분한 AM이 없기 때문에이 AM까지 대답 할 수 없었습니다. 내일까지 내 답변을 선택할 수는 없지만 당분간은 Edgar를 대기열에서 꺼내겠습니다. – user2084042

답변

4

전무 값을 확인하기위한 where 함수 내 구문은

ATTRIBUTE = nil 

하지만이를 해결 한 경우가 아니라

ATTRIBUTE IS nil 
+1

SomeModel.where (my_atribute : nil)를 더 잘 사용하면 쿼리가 올바르게 생성됩니다. –

+0

.where 쿼리를 만족시키기 위해 두 가지 조건이있을 때이 옵션을 사용할 수 있습니까? 나는 이것이 효과가 없을 것이라는 인상을 받았다. 가난하게 말한 질문에 대해 유감스럽게 생각합니다. 나는 두 가지 조건을 명시하는 전화에 대해 이야기하고 있음을 분명히하기 위해 다시 말 할 것입니다. – user2084042

+0

'ATTRIBUTE IS is nil'이 작동하지 않습니다. 대신 'ATTRIBUTE IS NULL'을 사용하십시오. where()로 표현식을 직접 사용하면 @EdgarsJekabsons 접근 방식을 사용할 수도 있습니다. – Albert

0

콘솔에서 중단 점을 넣고 재생하면 콘솔에서 검색하는 것과 분명히 다른 것이 있습니다. 디버깅 용 보석 https://github.com/deivid-rodriguez/byebug

또한 DrmMorning이 Drm에 속하고 Drm이 사용자에게 속한 경우 DrmMorning에서 사용자 열이 필요합니까? has_many through를 사용하여 사용자로부터 액세스 할 수 있습니다.

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

+0

나는 has-many-through 협회를 보지 않았고, 단지 many는 many/pairs를 가지고있다.포인터와 보석 제안에 감사드립니다. – user2084042

관련 문제