Rails의 컨트롤러에서 레코드가 있는지 확인하십시오.
내 앱에서 사용자는 비즈니스를 만들 수 있습니다. 그들이 index
내 에서 작업 을 트리거하면 BusinessesController
비즈니스가 다음과 관련되어 있는지 확인하고 싶습니다 current_user.id
.
- 그렇다면 : 업체를 표시하십시오.
- 그렇지 않은 경우 :
new
작업으로 리디렉션합니다 .
나는 이것을 사용하려고했다 :
if Business.where(:user_id => current_user.id) == nil
# no business found
end
그러나 그것은 사업이 존재하지 않더라도 항상 사실을 반환합니다.
데이터베이스에 레코드가 있는지 어떻게 테스트 할 수 있습니까?
코드가 작동하지 않는 이유는 무엇입니까?
where
메소드가 리턴 액티브 :: 관계 객체 (의 결과를 포함하는 배열 같은 역할은 where
) 는 비어있을 수 있지만 결코 것입니다nil
.
Business.where(id: -1)
#=> returns an empty ActiveRecord::Relation ( similar to an array )
Business.where(id: -1).nil? # ( similar to == nil? )
#=> returns false
Business.where(id: -1).empty? # test if the array is empty ( similar to .blank? )
#=> returns true
하나 이상의 레코드가 있는지 테스트하는 방법은 무엇입니까?
옵션 1 : 사용.exists?
if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
옵션 2 : 사용 .present?
(또는 .blank?
의 반대 .present?
)
if Business.where(:user_id => current_user.id).present?
# less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
# ...
end
옵션 3 : if 문의 변수 할당
if business = Business.where(:user_id => current_user.id).first
business.do_some_stuff
else
# do something else
end
이 옵션은 일부 린터 (예 : Rubocop)에 의해 코드 냄새로 간주 될 수 있습니다.
옵션 3b : 변수 할당
business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end
.find_by_user_id(current_user.id)
대신 사용할 수도 있습니다..where(...).first
최상의 옵션 :
Business
개체를 사용하지 않는 경우 : 옵션 1Business
개체 를 사용해야하는 경우 : 옵션 3
이 경우 exists?
ActiveRecord에서 제공 하는 방법 을 사용하고 싶습니다 .
Business.exists? user_id: current_user.id
'존재합니까?':
Business.exists? user_id: current_user.id #=> 1 or nil
'any?'와 함께 :
Business.where(:user_id => current_user.id).any? #=> true or false
.where와 함께 무언가를 사용하는 경우 범위 문제를 피하고 .unscoped를 더 잘 사용 하십시오.
Business.unscoped.where(:user_id => current_user.id).any?
ActiveRecord#where will return an ActiveRecord::Relation object (which will never be nil). Try using .empty? on the relation to test if it will return any records.
When you call Business.where(:user_id => current_user.id)
you will get an array. This Array may have no objects or one or many objects in it, but it won't be null. Thus the check == nil will never be true.
You can try the following:
if Business.where(:user_id => current_user.id).count == 0
So you check the number of elements in the array and compare them to zero.
or you can try:
if Business.find_by_user_id(current_user.id).nil?
this will return one or nil.
business = Business.where(:user_id => current_user.id).first
if business.nil?
# no business found
else
# business.ceo = "me"
end
I would do it this way if you needed an instance variable of the object to work with:
if @business = Business.where(:user_id => current_user.id).first
#Do stuff
else
#Do stuff
end
참고URL : https://stackoverflow.com/questions/16682699/check-if-record-exists-from-controller-in-rails
'programing' 카테고리의 다른 글
자바 : 파일 이름을 기본 및 확장으로 분할 (0) | 2020.10.13 |
---|---|
Scala에서 인덱스를 사용한 효율적인 반복 (0) | 2020.10.13 |
Django : 인증 사용자를 모델로 가져 오기 (0) | 2020.10.13 |
Objective-C-nan에 대한 플로트 검사 (0) | 2020.10.13 |
SQL 쿼리 : 테이블에서 최신 N을 제외한 모든 레코드를 삭제 하시겠습니까? (0) | 2020.10.13 |