Ruby on Rails:在每个模型中使用id进行应用程序范围的过滤

时间:2012-10-14 10:26:24

标签: ruby-on-rails

我正在为俱乐部做这个软件,人们可以登录并添加分数,球员,球队等。现在我当然有很多俱乐部,每个模特都有club_id专栏来识别那个俱乐部。是否有一些更简单的方法来检查当前的俱乐部而不是写这样的东西:

News.where("club_id = ?", @club_id)

我发现很难抽象出这个问题,以至于我找不到任何答案。

3 个答案:

答案 0 :(得分:1)

一种方法是为您的模型制作一些基本课程:

class ClubStuff < ActiveRecord::Base
  self.abstract_class = true # <--- don't forget
  default_scope { where(club_id: Thread.current[:club_id]) }
end

让你的模型脱颖而出:

class News < ClubStuff

然后:

# in ApplicationController
before_filter { Thread.current[:club_id] = params[:club_id] }

我希望你明白了。

答案 1 :(得分:0)

为什么在RoR的每个模型中都有默认的id属性时创建一个额外的id(club_id)?您可以使用此代码

  

News.find(ID)。

如果你仍然坚持,那么替代代码是:

  

News.find_by_club_id(@club_id)

答案 2 :(得分:0)

你可以在你的控制器中写一些过滤器。使用您的Team示例:

class TeamController < AC
  before_filter :get_club, :only => [ :index ]    # you can limit the filter to methods

  def index
    # because of the before filter you can access club here
    @teams = @club.teams
  end

  # ...

  private
  def get_club
    @club = Club.find(params[:club_id])
  end
end

此行为也可以移动到模块中。有关过滤器的详情,请参阅here