如何按特定值过滤模型的行?

时间:2012-04-26 02:46:24

标签: ruby-on-rails ruby activerecord

我想只返回属于用户的元素。 user_id值是Run中的一列。我想要的只是选择runs中的current_user

def index
  @runs = Run.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @runs }
  end
end

尝试类似

@runs = Run.where(user_id= => current_user.id)

但它没有奏效。我该怎么办?

3 个答案:

答案 0 :(得分:5)

如果您的用户模型与运行模型之间存在关联,则应该只能current_user.runs。例如:

class User < ActiveRecord::Base
  has_many :runs
end

class Run < ActiveRecord::Base
  belongs_to :user
end

我不知道您的实际数据库架构或型号名称,因此我无法确定这是否适合您的情况。

答案 1 :(得分:2)

参数化.where()使用如下语法:

@runs = Run.where("user_id = ?", current_user.id)

它也可以作为哈希来完成,它可能更具可读性:

@runs = Run.where(:user_id => current_user.id)

不要这样做(作为普通字符串)......

因为它可能会打开SQL注入漏洞,即使id不太可能被篡改......

# Don't do this...
@runs = Run.where("user_id = #{current_user.id}")

查看documentation on ActiveRecord conditions以获取完整详情。

答案 2 :(得分:1)

宝石cancan非常适合这些目的。如果您在user_idRun中添加Ability :read类,load_resource param,index在控制器中,则自动加载仅适用于当前用户的{{1}} {1}}行动。阅读文档以补充:)