簡體   English   中英

在Rails ruby​​中編寫很多重復的If語句的更好方法

[英]better way to write If statement with a lot of repeats in rails ruby

我有一個包含30個不同列的表,並且我正在嘗試編寫一種對包含值的每一列進行調用的方法。

例如。

def add_details 
customer = Customer.find self.customer_id 
if self.room1.present? && self.room2.present? && self.room3.present? && self.room4.present? && self.room5.present?  && self.room6.present? && self.room7.present?  && self.room8.present? && self.room9.present? && self.room10.present? && self.room11.present? && self.room12.present? && self.room13.present? && self.room14.present? && self.room15.present?  && self.room16.present? && self.room17.present?  && self.room18.present? && self.room19.present? && self.room20.present? && self.room21.present? && self.room22.present? && self.room23.present? && self.room24.present? && self.room25.present?  && self.room26.present? && self.room27.present?  && self.room28.present? && self.room29.present? && self.room30.present? 

elsif self.room.present? && self.room2.present? && self.room3.present? && self.room4.present? && self.room5.present?  && self.room6.present? && self.room7.present?  && self.room8.present? && self.room9.present? && self.room10.present? && self.room11.present? && self.room12.present? && self.room13.present? && self.room14.present? && self.room15.present?  && self.room16.present? && self.room17.present?  && self.room18.present? && self.room19.present? && self.room20.present? && self.room21.present? && self.room22.present? && self.room23.present? && self.room24.present? && self.room25.present?  && self.room26.present? && self.room27.present?  && self.room28.present? && self.room29.present? 
  room = Room.find self.room
  .....
  room29 = ... end end 

很多重復我自己,我知道ruby是動態的,所以應該有一種像for循環那樣增加數字的方法,它仍然可以工作。 我不知道有人能寫出更好的方法嗎

好吧,你可以做這樣的事情:

if (up_to_29 = (1..29).all?{|i| send("column#{i}").present? }) && column30.present?
  # update_columns column1: ...
elsif up_to_29
  # update_columns column1: ...

您可以使用一系列數字進行循環,並在每個數字上調用"column_#{i}" all? 如果循環的每個迭代為true,則方法將返回true。 嘗試這樣的事情:

if (1..30).all?{|index| self.send("column#{index}")&.present? }
  #...
elsif (1..29).all?{|index| self.send("column#{index}")&.present? }
  #...

選項1:假設所有模型屬性都需要驗證

validate_needed_columns = Model.attribute_names
while validate_needed_columns.present? do
  if validate_needed_columns.all?{ |c| Model[c].present? }
    Model.update_columns(<Hash here>)
    break
  end

  validate_needed_columns.pop
end

選項2:使用映射設置需要更新的列

validate_needed_columns = {
  column_name_1: value_to_update_1,
  ...
  column_name_n: value_to_update_n
}
validate_needed_column_keys = validate_needed_columns.keys
while validate_needed_column_keys.present? do
  if validate_needed_column_keys.all?{ |c| Model[c].present? }
    Model.update_columns(<Use mapping to set value here>)
    break
  end

  validate_needed_column_keys.pop
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM