【问题标题】:Need to bring back information on intermediate model with terminal model on Rails has_many through需要通过 Rails has_many 带回中间模型和终端模型的信息
【发布时间】:2012-01-03 23:41:25
【问题描述】:

我有以下型号:

学校.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

播放器.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.rb

def show
  @school = School.find(params[:id], :include => [{:offers => :player}])
  @seniors = @school.teamplayers.sr

我的问题是我需要显示 offer 模型中与 School 和 Player 之间的关系相关联的字段。目前,我正在视图中执行附加查询以获取此字段。

学校/show.haml.html

- @srpg.each do |player|
  = Offer.find_by_school_id_and_player_id(@school.id, player.id).status

显然这会导致 N+1 问题,但我似乎无法找到一种方法将 offer.status 和 player.* 都带回同一记录中。

【问题讨论】:

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


    【解决方案1】:

    改为使用优惠:

    # 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
    

    【讨论】:

    • 当我尝试执行上述操作时,我得到 NoMethodError: Offer Load (0.7ms) SELECT "offers".* FROM "offers" WHERE "offers"."school_id" = 1 undefined method #<:relation:0x007ffd2bed24e0> 的“包含”
    • 好的,所以我玩了一下,如果我使用“includes”而不是“include”和“:player”而不是“:players”,它将返回我需要的东西。我现在的问题是如何创建“of_seniors”,因为范围“:sr”​​取决于播放器模型。
    • 感谢您的更新,您推荐的范围定义出现语法错误。 /Users/paulpettengill/rails/recruits/app/models/offer.rb:14: syntax error, unexpected '(', expecting keyword_end scope :of_seniors, :includes(:player)
    • includes(:player) 不是:includes(:player)(没有“:”)!
    • 确保它进行内部连接,否则强制它:joins(:player).includes(:player).where(...)
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2016-09-11
    • 2015-10-27
    • 2020-02-24
    • 2016-07-24
    相关资源
    最近更新 更多