Как я могу следовать сухим методом в рельсах - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в рельсах. Так что не знаете, как следовать методу DRY . Давайте углубимся в вопрос.

У меня есть два метода в моем контроллере, где я следовал одному и тому же коду. Так как я могу уменьшить свой код. В этих двух методах только название модели получает разницу. Пожалуйста, помогите мне

Мне нужно что-то вроде этого

array = ['Userservice', 'Userschedule' ]
    array.each do |el|
        draft_info = el.find_by(user_id: 39, save_option: "publish")
        draft_info.delete if !draft_info.nil?
        @user_info = el.find_by(user_id: 39, save_option: "draft")
        el.create(@user_info.attributes.merge({:save_option => "publish", :id => el.maximum(:id).to_i.next }))
    end




def create_publish_user
    publish_user_schedule
    publish_user_service
end

def publish_user_service
 draft_service =  Userservice.where(user_id: current_user.id, save_option: "publish").delete_all
 user_service = Userservice.where(user_id: current_user.id, save_option: "draft")
 user_service.each { |ser|  
  Userservice.create(ser.attributes.merge({:save_option => "publish", :id => Userservice.maximum(:id).to_i.next }))
 }
end

def publish_user_schedule
 draft_schedule =  Userschedule.where(user_id: current_user.id, save_option: "publish").delete_all
 user_schedule = Userschedule.where(user_id: current_user.id, save_option: "draft")
 user_schedule.each { |sch|  
   Userschedule.create(sch.attributes.merge({:save_option => "publish", :id => Userschedule.maximum(:id).to_i.next }))
  }
end  

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Похоже, вы должны быть в состоянии сделать что-то вроде:

['Userservice', 'Userschedule'].each do |el|
  el_class = el.constantize
  if draft_info = el_class.find_by(user_id: 39, save_option: "publish")
    draft_info.delete
  end
  @user_info = el_class.find_by(user_id: 39, save_option: "draft")
  el_class.create(
    @user_info.attributes.merge({
      save_option: :publish, 
      id: el_class.maximum(:id).to_i.next 
    })
  )
end

Я не знаю, почему вы указываете id, когда вы делаете create. Почему вы делаете это вместо того, чтобы позволить ActiveRecord позаботиться об этом за вас?

0 голосов
/ 11 октября 2019

Вы можете передать аргумент вашему методу

def publish(type)
  draft = type.where(....)
  data = type.where(....)
  data.each ....
  # And so on
end

# Somewhere in your code you use it then
publish(UserService)
...