Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord具有关联_Ruby On Rails_Activerecord_Associations - Fatal编程技术网

Ruby on rails ActiveRecord具有关联

Ruby on rails ActiveRecord具有关联,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我想知道,当一个对象正好与另一个类的n个对象关联时,建立关系模型的最佳方法是什么。我想将has_one关系扩展为n的特定值 例如,TopFiveMoviesList将属于用户,并且正好有五部电影。我可以想象,底层sql表将有一些字段,如movie\u id\u 1、movie\u id\u 2。。。电影《身份证》5 我知道我可以建立很多关系,并限制模型级别的孩子数量,但我不希望有中间表 我想你的意思是“实施”而不是“模型”?建模在UML中非常简单,比如说,您有一个由5个电影实体组成的Person

我想知道,当一个对象正好与另一个类的n个对象关联时,建立关系模型的最佳方法是什么。我想将has_one关系扩展为n的特定值

例如,TopFiveMoviesList将属于用户,并且正好有五部电影。我可以想象,底层sql表将有一些字段,如movie\u id\u 1、movie\u id\u 2。。。电影《身份证》5

我知道我可以建立很多关系,并限制模型级别的孩子数量,但我不希望有中间表

我想你的意思是“实施”而不是“模型”?建模在UML中非常简单,比如说,您有一个由5个电影实体组成的Person实体

但是当你说有一个,去有五个时,困难就来了。如果它是一个简单的标量值,那么has_one可能是父实体上的一个属性。Has_5可能是通过UML中的“由组成”关系相互关联的两个实体

要回答的主要问题可能是,“你能保证它永远是‘前5位’吗?”如果是,就像你提到的那样,用列来建模。如果否,则使用其他实体对其进行建模

另一个问题可能是,“重构有多容易?”如果很简单,见鬼,从5列开始,如果有变化,重构到单独的实体


与往常一样,“最佳”取决于业务和技术环境。

我的第一反应是使用联接表,但如果这不符合要求,则用户。电影[1-5]\u id列将符合要求。(我认为
movie1id
movie1id
更符合Rails惯例)

由于您标记了此Rails和ActiveRecord,我将在我的答案中添加一些完全未经测试且可能有点错误的模型代码。:)

class用户movie}
结束
您可以用宏风格的方法来包装这一行,但除非这是应用程序的常见模式,否则这样做可能只会使代码更难阅读,而且没有什么好处

您可能还希望添加验证,以确保用户列表中没有重复的电影

将电影类关联回用户类似

class Movie < ActiveRecord::Base

  (1..User::TOP_N_MOVIES).each do |n| 
    has_many "users_list_as_top_#{n}".to_sym, :class_name => User, :foreign_key => "movie#{n}_id"
  end

  def users_list_as_top_anything
    ary = []
    (1..User::TOP_N_MOVIES).each {|n| ary += self.send("users_list_as_top_#{n}") }
    return ary
  end

end
class电影User,:foreign_key=>“movie{n}\id”
结束
def用户\u将\u列为\u顶部\u任何内容
ary=[]
(1..User::TOP|N|u MOVIES).each{N|ary+=self.send(“users_list_as_TOP|N}”)}
回程
结束
结束

(当然,
users\u list\u as\u top\u anything
最好写为显式SQL。我今天很懒。)

我认为通过连接模型实现此模型将是您最好的选择。它允许
列表
模型考虑列表逻辑,
电影
模型考虑电影逻辑。你可以创建一个
提名
(名字不是最好的,但你知道我的意思)模型来处理电影和名单之间的关系,当有5个提名限制时,你可以限制你撤回的提名数量

我认为这种方法更好有几个原因

首先,假设您希望能够以两种方式遍历关系(
movie.lists
list.movies
),那么5列方法将更加混乱

虽然ActiveRecord支持
hasn
关系要好得多,但它不支持,因此您将在这一点上与框架作斗争。而且,在这种情况下,
hasn
关系对我来说似乎有点脆弱。我还没有在ActiveRecord中看到过这种实现,尽管我真的很有兴趣看到它的实现。:)

class Movie < ActiveRecord::Base

  (1..User::TOP_N_MOVIES).each do |n| 
    has_many "users_list_as_top_#{n}".to_sym, :class_name => User, :foreign_key => "movie#{n}_id"
  end

  def users_list_as_top_anything
    ary = []
    (1..User::TOP_N_MOVIES).each {|n| ary += self.send("users_list_as_top_#{n}") }
    return ary
  end

end