在一个控制器中为视图调用两个相互依赖的模型

时间:2017-02-19 19:18:36

标签: mysql ruby-on-rails ruby ruby-on-rails-5

我是Rails的新手,所以我会尽力解释这个。

我有三个模特:artist,fest和festival_artist

艺术家仅包含ID和artist_name
fest只包含一个ID和festival_name
festival_artist包含ID,artist_id和festival_id

我使用脚手架创建了Fest,这就是我的控制器和show.html.erb所在的位置。

以下是我的模特:

class Artist < ApplicationRecord
  belongs_to :festival_artist
end

class Fest < ApplicationRecord
  belongs_to :festival_artist
end

class FestivalArtist < ApplicationRecord
  has_many :artists
  has_many :fests
end

在我的fests_controller.rb中,我有:

def show
  @festival_artists = FestivalArtist.where(festival_id: @fest.id) 
end

我试图添加:

def show
  @festival_artists = FestivalArtist.where(festival_id: @fest.id) 
  @artists = Artist.where(id: @festival_artists.artist_id)
end

然而,这会为#error抛出一个未定义的方法artist_id。

目标是在Fest的show.html.erb页面中显示该艺术家所属节日的艺术家姓名。

在SQL中它将是:

SELECT A.artist_name
FROM festival_artists AS FA
INNER JOIN artists AS A
ON FA.artist_id = A.id

有什么建议吗?即使告诉我谷歌会有什么帮助,因为我不确定我的术语是否正确。

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:2)

猜猜您的模型结构不是100%正确。请尝试查看http://guides.rubyonrails.org/association_basics.html了解详情。

有很多方法可以在Rails中处理你的关联:

  1. HABTM(拥有并属于许多人),如@grizzthedj回答中所述。

  2. has_many:通过关联

  3. 在这种情况下,您的代码看起来像

    class Artist < ApplicationRecord
      has_many :festival_artists
      has_many :fests, through: :festival_artists
    end
    
    class Fest < ApplicationRecord
      has_many :festival_artists
      has_many :artists, through: :festival_artists
    end
    
    class FestivalArtist < ApplicationRecord
      belongs_to :artists
      belongs_to :fests
    end
    

    因此您可以访问控制器中的艺术家

    def show
      @festival_artists = @fest.artists
    end
    

答案 1 :(得分:1)

我不确定你是否需要FestivalArtist模型。如果您在Artist和Fest模型中使用“has_and_belongs_to_many”,这将实现您正在寻找的多对多关系。

# fest.rb
class Fest < ActiveRecord::Base
  has_and_belongs_to_many :artists
end

# artist.rb
class Artist < ActiveRecord::Base
  has_and_belongs_to_many :fests
end