gpt4 book ai didi

ruby-on-rails - 如何在 Rails 3 中为 MongoMapper 模型实现 ActiveRecord 的 "scoped"?

转载 作者:太空宇宙 更新时间:2023-11-03 18:29:53 24 4
gpt4 key购买 nike

请注意,我是 Ruby 的新手,很多显而易见的事情对我来说并不那么明显 ;)

我有很多参数发送到我的 Controller (res、page、since)。我正在尝试使用这些参数为基于 MongoMapper 的模型编写查询。

问题是我必须为我想提供的每个参数组合指定请求。

例如

if (params[:res] && params[:page] && params[:since]) 
@movies = Movie.where(:FirstReleasedYear.gt => params[:since].to_i-1).sort(:DateModified.desc).paginate(:per_page => params[:res], :page => params[:page])
@total_results = Movie.where(:FirstReleasedYear.gt => params[:since].to_i-1).count
elsif (params[:res] && params[:page])
@movies = Movie.sort(:DateModified.desc).paginate(:per_page => params[:res], :page => params[:page])
@total_results = Movie.count
elsif (params[:since]) # Too slow request
@movies = Movie.where(:FirstReleasedYear.gt => params[:since].to_i-1).sort(:DateModified.desc)
@total_results = Movie.where(:FirstReleasedYear.gt => params[:since].to_i-1).count
else # default request
@year_now = Time.new.year
@movies = Movie.limit(30).offset(0).where(:FirstReleasedYear.gt => @year_now-1).sort(:DateModified.desc).order.all
@total_results = Movie.where(:FirstReleasedYear.gt => @year_now).count
end

这完全是灾难 - 如果我想添加一些新参数,我将不得不添加更多 ifs。

我很乐意按如下方式使用它

@movies = Movie.scoped # I've found this in example for ActiveRecord model

if (params[:since])
@movies.where(:FirstReleasedYear.gt => params[:since].to_i-1)
end
# Some other params like sort and so on
if (params[:res] && params[:page])
@movies.paginate(:per_page => params[:res], :page => params[:page])
end

请给我你的建议,告诉我如何处理这种情况

最佳答案

我将重点关注您拥有的这段代码:

@movies = Movie.where(:FirstReleasedYear.gt => params[:since].to_i-1).sort(:DateModified.desc)
@total_results = Movie.where(:FirstReleasedYear.gt => params[:since].to_i-1).count

目标:

  1. 使用命名范围帮助提高可读性
  2. 不要执行两次查询以获得计数

在你的模型中:

class Movie
include MongoMapper::Document
scope :released_in, :lambda{|year| where(:FirstReleasedYear.gt=>(year.to_i -1)}
end

您的 Controller 部分现在将如下所示:

@movies = Movie.released_in(params[:year]).sort(:DateModified.desc)
@total_results = @movies.count

其他建议:

  • 不要理会 params[:res],只需将其设置为默认值即可
  • 不检查 params[:page] 是否存在——如果不设置 will_paginate 将设置为 1
  • 如果您正在使用 will_paginate,您可以从中获取结果总数,不要执行额外的查询来获取计数

关于ruby-on-rails - 如何在 Rails 3 中为 MongoMapper 模型实现 ActiveRecord 的 "scoped"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com