Праверце, існуе запіс з кантролера ў Rails

У маім дадатку карыстальнік можа стварыць бізнэс. Калі яны выклікаюць індэкс Дзеянне ў маім BusinessesController Я хачу, каб праверыць, калі бізнес звязаны з current_user.id :

  • Калі так: адлюстраванне бізнэс.
  • Калі няма: перанакіраванне на новы дзеянні.

Я спрабаваў выкарыстаць гэта:

if Business.where(:user_id => current_user.id) == nil
  # no business found
end

Але ён заўсёды вяртае ісціну, нават калі бізнэс не існуе ...

<�Моцны> Як я магу праверыць, калі запіс існуе ў маёй базе дадзеных?

64
Выкарыстанне , дзе вяртае пусты масіў, калі няма запісаў. І [] ня роўнае нуль
дададзена аўтар mind.blank, крыніца
дададзена аўтар Ciro Santilli 包子露宪 六四事件 法轮功, крыніца
дададзена аўтар Ciro Santilli 包子露宪 六四事件 法轮功, крыніца
А як наконт проста калі Business.find_by_user_id (current_user.id) ?
дададзена аўтар Hengjie, крыніца
А як наконт проста калі Business.find_by_user_id (current_user.id) ?
дададзена аўтар Hengjie, крыніца

13 адказы

<�Моцны> Чаму ваш код не працуе?

<�Код>, дзе метад вяртае <�моцны> ActiveRecord :: Relation аб'ект (дзейнічае як масіў, які змяшчае вынікі , дзе ), <�моцны> ён можа быць пустым, але ён ніколі не будзе нуль .

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

Як праверыць, калі хаця б адзін запіс існуе?

Option 1: Using .exists?

if Business.exists?(user_id: current_user.id)
  # same as Business.where(user_id: current_user.id).exists?
  # ...
else
  # ...
end

Option 2: Using .present? (or .blank?, the opposite of .present?)

if Business.where(:user_id => current_user.id).present?
  # less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
  # ...
end

Option 3: Variable assignment in the if statement

if business = Business.where(:user_id => current_user.id).first
  business.do_some_stuff
else
  # do something else
end

Гэты варыянт можна разглядаць як код пах некаторых пуху (Rubocop, напрыклад).

Option 3b: Variable assignment

business = Business.where(user_id: current_user.id).first
if business
  # ...
else
  # ...
end

You can also use .find_by_user_id(current_user.id) instead of .where(...).first


<�Моцны> Лепшы варыянт:

  • If you don't use the Business object(s): Option 1
  • If you need to use the Business object(s): Option 3
187
дададзена
Паспрабуйце з першым перад выклікам сапраўднымі
дададзена аўтар MrYoshiji, крыніца
Так дайце мне хвіліну я буду абнаўляць мой адказ, і не выкарыстоўвайце .first перад .blank ;)
дададзена аўтар MrYoshiji, крыніца
О, гэта мая віна, я блытаю, вы павінны праверыць з прабел
дададзена аўтар MrYoshiji, крыніца
Дзякуй, што працавалі! Я не павінен быў заўважыць гэтую памылку. Не маглі б вы сказаць мне, чаму чэк == нуль не працуе?
дададзена аўтар user470763, крыніца
Я атрымліваю такую ​​ж праблему
дададзена аўтар user470763, крыніца
Я не выдалілі першы. Дзякуй за вашу дапамогу.
дададзена аўтар user470763, крыніца
Гэта не падобна на працу. Ён трымае праходзячы гэты тэст і загрузка індэкса HTML, як з выпрабаваннем == нуль (так я атрымліваю паведамленне пра памылку: не вызначаны метад `імя» для нуль: NilClass).
дададзена аўтар user470763, крыніца

<�Моцны> Чаму ваш код не працуе?

<�Код>, дзе метад вяртае <�моцны> ActiveRecord :: Relation аб'ект (дзейнічае як масіў, які змяшчае вынікі , дзе ), <�моцны> ён можа быць пустым, але ён ніколі не будзе нуль .

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

Як праверыць, калі хаця б адзін запіс існуе?

Option 1: Using .exists?

if Business.exists?(user_id: current_user.id)
  # same as Business.where(user_id: current_user.id).exists?
  # ...
else
  # ...
end

Option 2: Using .present? (or .blank?, the opposite of .present?)

if Business.where(:user_id => current_user.id).present?
  # less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
  # ...
end

Option 3: Variable assignment in the if statement

if business = Business.where(:user_id => current_user.id).first
  business.do_some_stuff
else
  # do something else
end

Гэты варыянт можна разглядаць як код пах некаторых пуху (Rubocop, напрыклад).

Option 3b: Variable assignment

business = Business.where(user_id: current_user.id).first
if business
  # ...
else
  # ...
end

You can also use .find_by_user_id(current_user.id) instead of .where(...).first


<�Моцны> Лепшы варыянт:

  • If you don't use the Business object(s): Option 1
  • If you need to use the Business object(s): Option 3
187
дададзена
Так дайце мне хвіліну я буду абнаўляць мой адказ, і не выкарыстоўвайце .first перад .blank ;)
дададзена аўтар MrYoshiji, крыніца
Паспрабуйце з першым перад выклікам сапраўднымі
дададзена аўтар MrYoshiji, крыніца
О, гэта мая віна, я блытаю, вы павінны праверыць з прабел
дададзена аўтар MrYoshiji, крыніца
Я атрымліваю такую ​​ж праблему
дададзена аўтар user470763, крыніца
Дзякуй, што працавалі! Я не павінен быў заўважыць гэтую памылку. Не маглі б вы сказаць мне, чаму чэк == нуль не працуе?
дададзена аўтар user470763, крыніца
Гэта не падобна на працу. Ён трымае праходзячы гэты тэст і загрузка індэкса HTML, як з выпрабаваннем == нуль (так я атрымліваю паведамленне пра памылку: не вызначаны метад `імя» для нуль: NilClass).
дададзена аўтар user470763, крыніца
Я не выдалілі першы. Дзякуй за вашу дапамогу.
дададзена аўтар user470763, крыніца

У гэтым выпадку я хацеў бы выкарыстаць існуе метад, які прадстаўляецца ActiveRecord:

Business.exists? user_id: current_user.id
24
дададзена
Ці з'яўляецца існуе? або магчымым?
дададзена аўтар Imran, крыніца

У гэтым выпадку я хацеў бы выкарыстаць існуе метад, які прадстаўляецца ActiveRecord:

Business.exists? user_id: current_user.id
24
дададзена
Ці з'яўляецца існуе? або магчымым?
дададзена аўтар Imran, крыніца

з «існуе?»:

Business.exists? user_id: current_user.id #=> 1 or nil

з «любы?»:

Business.where(:user_id => current_user.id).any? #=> true or false

<�Моцнага> Калі вы выкарыстоўваеце нешта з .гдом, пераканайцеся, каб пазбегнуць праблем з абласцямі і больш эфектыўным выкарыстаннем .unscoped

Business.unscoped.where(:user_id => current_user.id).any?
3
дададзена
Лепш выкарыстоўваць Business.unscoped.where (: user_id => current_user.id) .pluck (: ID) .Any? каб пазбегнуць unnecesary нагрузкі адносін для аб'екта, які вы правяраеце.
дададзена аўтар Juanin, крыніца

з «існуе?»:

Business.exists? user_id: current_user.id #=> 1 or nil

з «любы?»:

Business.where(:user_id => current_user.id).any? #=> true or false

<�Моцнага> Калі вы выкарыстоўваеце нешта з .гдом, пераканайцеся, каб пазбегнуць праблем з абласцямі і больш эфектыўным выкарыстаннем .unscoped

Business.unscoped.where(:user_id => current_user.id).any?
3
дададзена
Лепш выкарыстоўваць Business.unscoped.where (: user_id => current_user.id) .pluck (: ID) .Any? каб пазбегнуць unnecesary нагрузкі адносін для аб'екта, які вы правяраеце.
дададзена аўтар Juanin, крыніца

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.

Вы можаце паспрабаваць наступнае:

if Business.where(:user_id => current_user.id).count == 0

Такім чынам, вы праверыць колькасць элементаў у масіве і параўнаць іх да нуля.

ці вы можаце паспрабаваць:

if Business.find_by_user_id(current_user.id).nil?

гэта верне адзін або нуль.

1
дададзена

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.

Вы можаце паспрабаваць наступнае:

if Business.where(:user_id => current_user.id).count == 0

Такім чынам, вы праверыць колькасць элементаў у масіве і параўнаць іх да нуля.

ці вы можаце паспрабаваць:

if Business.find_by_user_id(current_user.id).nil?

гэта верне адзін або нуль.

1
дададзена

ActiveRecord #, дзе будзе вяртаць аб'ект ActiveRecord :: сувязь (які ніколі не будзе нуль). Паспрабуйце выкарыстоўваць .empty? ў адносінах да выпрабавання, калі ён будзе вяртаць якую-небудзь запіс.

1
дададзена

Я хацеў бы зрабіць гэта такім чынам, калі вам неабходна зменную асобніка аб'екта для працы з:

if @business = Business.where(:user_id => current_user.id).first
  #Do stuff
else
  #Do stuff
end
0
дададзена

Я хацеў бы зрабіць гэта такім чынам, калі вам неабходна зменную асобніка аб'екта для працы з:

if @business = Business.where(:user_id => current_user.id).first
  #Do stuff
else
  #Do stuff
end
0
дададзена
business = Business.where(:user_id => current_user.id).first
if business.nil?
# no business found
else
# business.ceo = "me"
end
0
дададзена
business = Business.where(:user_id => current_user.id).first
if business.nil?
# no business found
else
# business.ceo = "me"
end
0
дададзена