0

我有 4 桌联赛、分区、球队和教练。这些表之间的关系被描述为一个联赛有很多分区,一个分区有很多球队但一个球队只有一个教练。我还想通过与团队相关的部门查询团队的联赛。

我目前的设置:

class League < ActiveRecord::Base
  has_many :divisions
  has_many :teams, :through => :divisions, :readonly => true
  has_many :coaches, :through => :teams, :readonly => true
end

class Division < ActiveRecord::Base
  belongs_to :league
  has_many :teams
end

我应该提到这一点,我正在使用回形针上传团队徽标。但是,当我想将存储路径更改为:/public/assets/images/teams/[division_name]/:style/:basename.:extension 时,我不知道如何获取要使用的团队的部门名称用于文件系统存储的路径和 url。

class Team < ActiveRecord::Base
  belongs_to :division
  belongs_to :league
  belongs_to :stadium

  has_many :players
  has_one :coach

  has_attached_file :logo, :styles => { :large => "120x180>", :thumb => "100x100>", :tiny => "25x25>" },  
      :url => "/assets/images/teams/#{name}/:style/:basename.:extension",  
      :path => ":rails_root/public/assets/images/teams/#{name}/:style/:basename.:extension"

end

class Coach < ActiveRecord::Base
  belongs_to :division
  belongs_to :league
  belongs_to :stadium
  belongs_to :team
end

到目前为止我的问题:

  1. 我设置正确吗?我想查询联赛或分区的教练和球队是非常重要的。
  2. 在 Team 类中,我想定义一个方法(或任何它调用的方法),它返回团队的部门名称,以将该部门名称包含到存储配置的 url 和路径中,如上所述。

任何帮助将非常感激!

更新:我尝试self.division.name在 team.rb 类中使用来获取团队部门的名称:

has_attached_file :logo, :styles => { :large => "120x180>", :thumb => "100x100>", :tiny => "25x25>" },  
      :url => "/assets/images/teams/#{self.division.name}/:style/:basename.:extension",  
      :path => ":rails_root/public/assets/images/teams/#{self.division.name}/:style/:basename.:extension"

但是,我收到此错误消息:

`method_missing': undefined method `division' for #<Class:0x10c6a2900> (NoMethodError)
4

1 回答 1

0

我不确定这是否是您想要的,但获取关联对象非常容易:

# in team.rb
self.division.name #self is not required

# in division.rb
self.teams.first.name

但是你不需要has_many :teams, :through => :divisions在你的 League 类中,因为它已经与 Division 相关联,而 Division 又与 Team 相关联。在设置多对多关联时,您只能使用“has_many through”。

# in league.rb
self.divisions.first.teams.first

你也可以用它asset_path('teams/my-name/some-file.jpg')来获取你的图像,但我想这只能在你的视图、助手和控制器中访问。

于 2012-08-26T19:44:01.627 回答