def index
@users = User.all.paginate(page: params[:page])
@users = User.named(params[:name]).paginate(page: params[:page]) if params[:name].present?
@users = User.countryname(params[:country]).paginate(page: params[:page]) if params[:country].present?
@users = User.gender(params[:gender_type]).paginate(page: params[:page]) if params[:gender_type].present?
end
如果只有:name
或:country
或:gender_type
为present
,则以下代码可以正常运行。但如果存在多个参数,它就不起作用。为多个参数编写此代码的DRY方式是什么?显然,我不想为每种可能的params组合创建不同的代码行。
以下是范围:
class User
scope :countryname, -> (country) { where("country ILIKE ?", "%#{country}%")}
scope :gender, -> (gender_type) { where gender_type: gender_type}
scope :named, -> (name) { where("name ILIKE ?", "%#{name}%")}
如果我有
的查询字符串example.com/users?name=sam&gender_type=male
它只是返回所有用户名为sam并忽略其性别的用户......我需要编码:
@users = User.gender(params[:gender_type]).named(params[:name]).paginate(page: params[:page]) if params[:gender_type] && params[:name].present?
但我不想为每个参数组合编写新的代码行。
答案 0 :(得分:2)
您可以使用ruby try
方法。例如,您可以编写类似
@users = User.try(:gender, params[:gender_type]).try(:paginate, page: params[:page])
请查看try in api docs了解其他使用方法。
答案 1 :(得分:0)
问题是代码应该是
@users = User.all.paginate(page: params[:page])
@users = @users.named(params[:name]).paginate(page: params[:page]) if params[:name].present?
etc
然后Rails将自动允许链接范围。前面的代码创建单独的独立非链式实例变量。