3

好的,我知道这是针对 Saas 课程的,人们也一直在问与此相关的问题,但我花了很多时间尝试和阅读,但我被困住了。首先,当您有一个名为 Movie 的模型时,最好使用 Ratings 作为模型并将它们关联起来,还是将 Ratings 保留在一个浮动在空间中的数组中(!)。其次,这是我现在在控制器中的内容:

def index

@movies = Movie.where(params[:ratings].present? ? {:rating => (params[:ratings].keys)} :   {}).order(params[:sort])
@sort = params[:sort]
@ratings = Ratings.all

end

现在,我决定创建一个 Ratings 模型,因为我认为它会更好。这是我的看法:

= form_tag movies_path, :method => :get do

Include:
- @ratings.each do |rating|
 = rating.rating
 = check_box_tag "ratings[#{rating.rating}]"
= submit_tag "Refresh"

我尝试了与在以“ .include?(rating) ? true : "" 结尾的复选框标记中使用条件三元相关的所有内容,我只需要指导。提前谢谢!

更新(控制器的方法):

这是我的控制器中读取此哈希的索引方法 - 为清楚起见。我为之前的模糊性道歉。

def index    
  @all_stores = Product.all_stores
  @selected_stores = params[:stores] || session[:stores] || {}

  if @selected_stores == {}
    @selected_stores = Hash[@all_stores.map {|store| [store, store]}]
  end
  if params[:stores] != session[:stores]
    # session[:stores] = @selected_stores
    session[:stores] = params[:stores]
    redirect_to :stores => @selected_stores and return
  end
  @products = Product.order("created_at desc").limit(150).find_all_by_store(@selected_stores.keys).group_by { |product| product.created_at.to_date}
. . . etc
4

1 回答 1

12

几件事

1).order(params[:sort])为您打开 sql 注入攻击,有人可能会通过将其放入查询字符串中删除您的所有用户

http://localhost:3000/movies?sort=email%3B+DELETE+from+users+--

请参阅rails 3 activerecord order - 什么是正确的 sql 注入工作?,.where 不存在此问题,rails 将清理 where 方法的输入

2)次要的事情,AREL延迟对数据库的实际调用,直到您迭代集合,所以您可以“构建”查询,这种语法可能比使用三元运算符更容易理解?

@movies = Movie.order(xxxxxx)
@movies = @movies.where(:rating => params[:ratings].keys) if params[:ratings].present?

3)对于您的收视率,就像 cdesrosiers 说常数很好,那么您的观点

Movie::RATINGS.each do |rating|
  check_box_tag "ratings[]", rating # <input type="checkbox" name="ratings[]" value="PG" />

编辑:保持选定的值

# controller
@selected_ratings = (params[:ratings].present? ? params[:ratings] : [])

# view
Movie::RATINGS.each do |rating|
  check_box_tag "ratings[]", rating, @selected_ratings.include?(rating)
  # <input type="checkbox" name="ratings[]" value="PG" checked="checked" />

请注意复选框命名中的 [],这将为您提供 params[:ratings] 作为控制器操作中的数组

@movies = @movies.where("rating IN (?)", params[:ratings]) if params[:ratings].present? and params[:ratings].any?

一些链接

于 2012-06-10T22:05:16.607 回答