需要在Rails has_many上通过终端模型带回中间模型的信息

时间:2012-01-03 23:41:25

标签: ruby-on-rails-3 include has-many-through named-scope

我有以下型号:

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和播放器。*放在同一条记录中。

1 个答案:

答案 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
相关问题