我有以下型号:
school.rb
class School < ActiveRecord::Base
has_many :offers
has_many :players, :through => :offers
has_many :teammembers, :class_name => 'Offer', :conditions => ["on_roster = \'t\'"]
has_many :teamplayers, :through => :teammembers, :source => :player
player.rb
class Player < ActiveRecord::Base
has_many :offers, :dependent => :destroy
scope :sr, lambda {
where("(players.year = ? and players.redshirt = 't') or (players.year = ? and players.redshirt = 'f')", (Time.now + 8.months - 5.years).year, (Time.now + 8.months - 4.years).year)
}
offer.rb
class Offer < ActiveRecord::Base
belongs_to :school
belongs_to :player
validates_uniqueness_of :school_id, :scope => [:player_id]
然后在我的schools_controller中我有
schools_controller.rb
def show
@school = School.find(params[:id], :include => [{:offers => :player}])
@seniors = @school.teamplayers.sr
我的问题是我需要显示与学校和玩家之间关系相关的商品模型中的字段。目前我正在视图中执行其他查询以获取此字段。
学校/ show.haml.html
- @srpg.each do |player|
= Offer.find_by_school_id_and_player_id(@school.id, player.id).status
显然这会导致N + 1问题,但我似乎无法想出一种方法可以将offer.status和播放器。*放在同一条记录中。
答案 0 :(得分:2)
改为使用优惠:
# in model
class Offer
belongs_to :player
scope :of_seniors, includes(:player).where('player.kind = "senior"')
end
# in controller
@seniors_offers = @school.offers.of_seniors
# in view
- for offer in @seniors_offers
= offer.player.name
= offer.status
- end