我是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
有什么建议吗?即使告诉我谷歌会有什么帮助,因为我不确定我的术语是否正确。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
猜猜您的模型结构不是100%正确。请尝试查看http://guides.rubyonrails.org/association_basics.html了解详情。
有很多方法可以在Rails中处理你的关联:
HABTM(拥有并属于许多人),如@grizzthedj回答中所述。
has_many:通过关联
在这种情况下,您的代码看起来像
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