私は、人々がサインインしてスコア、プレーヤー、チームなどを追加できるクラブ向けにこのソフトウェアを使用しています。もちろん、今では多くのクラブがあり、すべてのモデルにそのクラブを識別するclub_id列があります。次のようなものを書くよりも、現在のクラブをチェックする簡単な方法はありますか?
News.where("club_id = ?", @club_id)
この問題を抽象化するのは難しすぎて、答えを見つけることができませんでした。
私は、人々がサインインしてスコア、プレーヤー、チームなどを追加できるクラブ向けにこのソフトウェアを使用しています。もちろん、今では多くのクラブがあり、すべてのモデルにそのクラブを識別するclub_id列があります。次のようなものを書くよりも、現在のクラブをチェックする簡単な方法はありますか?
News.where("club_id = ?", @club_id)
この問題を抽象化するのは難しすぎて、答えを見つけることができませんでした。
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] }
私はあなたがその考えを理解したことを望みます。
RoRのすべてのモデルにデフォルトのid属性があるのに、なぜ追加のID(club_id)を作成するのですか?このコードを使用できます
News.find(id)。
それでも主張する場合は、代替コードは次のとおりです。
News.find_by_club_id(@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
この動作は、モジュールに移動することもできます。フィルタの詳細については、こちらをご覧ください。