2014-07-21 53 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 
相关问题