我有一个遗留数据库,我正在努力让ActiveRecord使用。我遇到了连接表的问题。我有以下内容:
class TvShow < ActiveRecord::Base
set_table_name "tvshow"
set_primary_key "idShow"
end
class Episode < ActiveRecord::Base
set_table_name "episode"
set_primary_key "idEpisode"
end
然后我有一个名为tvshowlinkepisode的表有2个字段:idShow,idEpisode所以我有2个表和它们之间的连接(所以有多对多的关系),但是连接使用非标准外键。我的第一个想法是创建一个名为TvShowEpisodeLink的模型,但没有主键。我的想法是,由于外键是非标准的,我可以使用set_foreign_key并进行一些控制。最后我想说一些像TvShow.find(:last).episodes或Episode.find(:last).tv_show。我怎么去那里?
答案 0 :(得分:9)
我相信你可以使用has_and_belongs_to_many的选项比Alvaro的回答更优雅,尽管他的回答非常好,并且会为你班级的任何客户提供相当相同的功能。
class TvShow < ActiveRecord::Base
set_table_name "tvshow"
set_primary_key "idShow"
has_and_belong_to_many :episodes,
:join_table => "tvshowlinkepisode",
:foreign_key => "idShow",
:association_foreign_key => "idEpisode"
end
class Episode < ActiveRecord::Base
set_table_name "episode"
set_primary_key "idEpisode"
has_and_belongs_to_many :tv_shows,
:join_table => "tvshowlinkepisode",
:foreign_key => "idEpisode",
:association_foreign_key => "idShow"
end
请注意:foreign_key选项指定哪个列是链接“this side”上的类的id,而:association_foreign_key指定链接“另一侧”的类的id列。
将此与Alvaro的答案进行对比,此模式应避免实例化任何不必要的对象来表示链接。
答案 1 :(得分:5)
这项工作适合你......
class TvShow < ActiveRecord::Base
set_table_name "tvshow"
set_primary_key "idShow"
has_many :tv_show_link_episode, :foreign_key => 'idShow'
has_many :episodes, :through => :tv_show_link_episode
end
class Episode < ActiveRecord::Base
set_table_name "episode"
set_primary_key "idEpisode"
has_many :tv_show_link_episode, :foreign_key => 'idEpisode'
has_many :tv_shows, :through => :tv_show_link_episode
end
class TvShowLinkEpisode < ActiveRecord::Base
set_table_name "tvshowlinkepisode"
# the foreign key is named by the TvShowLinkEpisode field,
# the primary key name is for the primary key of the associated class
belongs_to :tv_show, :foreign_key => 'idShow'
belongs_to :episode, :foreign_key => 'idEpisode'
end
答案 2 :(得分:0)
这种关系是一对多的,所以你需要在表格中使用belongs_to / has__many关系。如果数据库具有视图,则可以通过表的视图来屏蔽非标准外键。
不确定这是否符合你所需要的100%,但我希望它至少能给你一个想法。
答案 3 :(得分:0)
有了这个,你不需要设置表视图,实际上,表视图不是“The Rails Way”,
试试这个:
>> TvShow.find(1).episodes
#=> returns an array with [#<Episode idEpisode: 1, test: "Episode 1">]
>> Episode.find(1). tv_shows
#=> returns an array with [#<TvShow idShow: 1, test: "tvshow 1">]
然后你可以做一些像:
e = Episode.find(1)
TvShow.find(1). episodes << e
#=> this make the proper association