我正在为俱乐部做这个软件,人们可以在其中登录并添加分数、球员、球队等。现在我当然有很多俱乐部,每个模型都有一个 club_id 列来识别那个俱乐部。有没有比写这样的东西更容易检查当前俱乐部的方法:
News.where("club_id = ?", @club_id)
我发现将这个问题抽象得太难以至于我找不到任何答案。
我正在为俱乐部做这个软件,人们可以在其中登录并添加分数、球员、球队等。现在我当然有很多俱乐部,每个模型都有一个 club_id 列来识别那个俱乐部。有没有比写这样的东西更容易检查当前俱乐部的方法:
News.where("club_id = ?", @club_id)
我发现将这个问题抽象得太难以至于我找不到任何答案。
一种方法是为您的模型制作一些基本类:
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] }
我希望你明白了。
好吧,您可以在控制器中编写一些前置过滤器。使用您的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
这种行为也可以移动到模块中。有关过滤器的更多信息,请参见此处。
当 RoR 中的每个模型都有默认的 id 属性时,为什么要创建一个额外的 id(club_id)?您可以使用此代码
新闻.find(id)。
如果您仍然坚持,那么替代代码是:
News.find_by_club_id(@club_id)