2014-07-21 71 views
0

我有,我希望能夠在由CURRENT_USER車型範圍的控制器Rails中模型過濾的最佳做法是什麼?

  • 1)的指數動作來篩選集合的使用情況下,如果提交
  • 2)params[:ids]

我使用委派過濾到模型與範圍或類方法:

class Zombie < ActiveRecord::Base 
    has_many :weapons 

    def self.filter_by_weapons(weapons) 
    where(weapons: weapons) 
    end 
end 

而在控制器

def index 
    @zombies = Zombie.filter_by_weapons(current_user.weapons) 
end 

它運作良好。但是,如果我想我的應用程序能夠過濾基於ID的名單上的zombies,我會做:

def index 
    @zombies = Zombie.filter_by_weapons(current_user.weapons) 

    if params[:weapons_ids] 
    @zombies = @zombies.filter_by_weapons(Weapon.where(id: params[:weapon_ids])) 
    end 
end 

然而,這打破了只有一種模式,應在控制器動作被稱爲規則。

我試着範圍由IDS,而不是模型實例,但問題是相反的,我要的current_user.weapons

所以ID映射,什麼是做到這一點的最好方法是什麼?

+0

我沒有時間到後一個完整的答案,但檢查出拉姆達範圍。 – emcanes

回答

0

可以重構方法如下:

def self.filter_by_weapons(weapons) 
    weapon_ids = weapons.first.kind_of?(Weapon) ? weapons.map(&:id) : weapons 
    where(weapons: { id: weapon_ids.presence || -1 }) 
end 

而且使用這樣的:

def index 
    @zombies = Zombie.filter_by_weapons(current_user.weapons) 
    @zombies = @zombies.filter_by_weapons(params[:weapon_ids]) if params[:weapons_ids].present? 
end 
相關問題