Ruby on rails 旧数据库的ActiveRecord联接表

Ruby on rails 旧数据库的ActiveRecord联接表,ruby-on-rails,ruby,database,activerecord,legacy,Ruby On Rails,Ruby,Database,Activerecord,Legacy,我有一个遗留数据库,我正在努力让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 c

我有一个遗留数据库,我正在努力让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
class-TvShow

然后我有一个名为TVShowLinkedPiSode的表,它有两个字段:idShow、idEpisode,所以我有两个表,它们之间有一个连接(多对多关系),但是连接使用非标准外键。我的第一个想法是创建一个名为TvShowEpisodeLink的模型,但没有主键。因为外键是非标准的,所以我可以使用set_外键并进行一些控制。最后,我想说一些类似于TvShow.find(:last)。集或集。find(:last)。tv_show。如何到达该位置?

该关系是一对多关系,因此需要在表中使用“属于/拥有”多关系。如果数据库具有视图,则可以通过表的视图来屏蔽非标准外键

不确定这是否100%符合您的需要,但我希望它至少能给您一个想法。

这项工作适合您

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
class-TvShow'idShow'
有很多:集,:通过=>:电视节目\u链接\u集
结束
类集'idEpisode'
有很多:电视节目,:通过=>:电视节目\u链接\u插曲
结束
类TVShowLinkedPiNode'idShow'
属于:插曲,:外键=>'idEpisode'
结束

这样,您不需要设置表视图,实际上,表视图不是“Rails方式”

试试这个:

>> 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">]
>TvShow.find(1).剧集
#=>返回带有[#]的数组
>>第1集。电视节目
#=>返回带有[#]的数组
然后你可以做一些事情,比如:

e = Episode.find(1)
TvShow.find(1). episodes << e
#=> this make the proper association
e=eposion.find(1)
TvShow.find(1)。这是正确的联想

我相信你可以比Alvaro的答案稍微优雅一些,使用选项to has_and_belies_to_many,尽管他的答案非常好,并且会为你的类中的任何客户提供完全相同的功能

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
class-TvShow“TVShowLinkedPiSode”,
:外键=>“idShow”,
:关联\外部\键=>“idEpisode”
结束
类集“TVShowLinkedPiSode”,
:外键=>“idEpisode”,
:关联\外部\键=>“idShow”
结束
请注意:foreign\u key选项指定哪一列是链接“这一侧”上类的id,而:association\u foreign\u key指定的列是链接“另一侧”上类的id


与Alvaro的答案相比,这种模式应该避免实例化任何不必要的对象来表示链接。

有趣的想法。我以前从未使用过数据库视图。我无法更改数据库的任何内容,因此我不确定数据库视图在这里是否有效。关于has_和_属于_许多关系,如果我有非标准主键,这不就分崩离析了吗?我认为通过使用第三个模型,我可以通过关系来做has_和would_to_many_。呃,在上面的回答中使用非标准外键:关于has_和woul to_many关系,如果我有非标准外键,这不是会崩溃吗?好吧,我们的想法是使用标准外键,视图基本上将标准外键转换为表中的非标准外键。视图可以非常简单,只需重新命名字段即可(即创建视图TvShowView作为选择tvshow,idShow作为tvshow中的Show_id)。只要视图与表有一对一的关系,您也可以使用它进行插入和更新。我认为一集只能属于一个特定的电视节目,而不是很多。我也认为,@txwikinger,但我猜这个例子是,如果一个节目有一个衍生系列,在他们各自的系列中的某个时候,他们可能会有一集,这两个节目走到一起。无论如何,通过activerecord让其他人的数据库具有逻辑意义是很有趣的。