我想知道什么是最好的方式,模型一个关系,其中一个对象是与正n对象的另一类。我想要延长has_one关系到一个特定的价值。

例如,一个TopFiveMoviesList将属于用户和具有完全的五个电影。我会想象这一基础sql表会等领域movie_id_1,movie_id_2,...movie_id_5.

我知道我可以做一个has_many关系,并限制儿童人数的模型级别的,但我宁愿没有一个中间表。

有帮助吗?

解决方案

我的第一本能是使用一个加入表中,但是如果那不是希望 User.movie[1-5]_id 列将适合的法案。(我觉得 movie1_id 更适合与轨《公约》比 movie_id_1.)

因为你标记这一轨道和Email,我会加入一些完全未经测试的和可能有些错误的模型的代码给我答案。:)

class User < ActiveRecord::Base
  TOP_N_MOVIES = 5
  (1..TOP_N_MOVIES).each { |n|  belongs_to "movie#{n}".to_sym, :class_name => Movie }
end

你可以把那个包线在一个宏观风格的方法,但除非如果这是一个共同的模式应用程序,这样做可能会只是让你的代码,就更难于阅读有点干的好处。

你可能还需要增加验证,以确保没有重复的电影上一个用户的清单。

联你的电影类回到你的用户是类似的。

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

(当然, users_list_as_top_anything 可能会更好写出为明确SQL。我懒的今天。)

其他提示

我认为,实施这种模型通过参加模式将是你最好的选择在这里。它允许的 List 模型的担心清单的逻辑和 Movie 模型用担心电影的逻辑。你可以创建一个 Nomination (姓名不是最伟大的,但是你知道我的意思)模型的处理之间的关系的电影和列表,并在有限的5,你可以只限数量的提名你拉回来。

有几个原因,我认为这种做法是更好。

第一,假设你希望能够穿越的关系,这两种方法(movie.listslist.movies),5个列的做法将是多混乱.

虽然它会好得多于Email支持 has n 的关系,它不,等等,你将是战斗的框架上的那一个。还有, has n 关系似乎有点脆我在这种情况。我还没有看到这种实施拉脱在Email,虽然我可真的很有兴趣看到这一点。:)

我认为你的意思是“实施”而不是“模特”?在UML中,建模非常简单,例如,你有一个由5个Movie实体组成的Person实体。

但是当你说has_one时会遇到困难,那就是has_5。如果它是一个简单的标量值,则has_one可能是父实体上的属性。 Has_5可能是通过“由......组成”彼此相关的2个实体。 UML中的关系。

要回答的主要问题可能是,“你能保证它永远是'前5名'吗?”如果是,请按照您提到的那样使用列对其进行建模。如果不是,请使用其他实体对其进行建模。

另一个问题可能是,“重构有多容易?”如果它很简单,那么,从5列开始,如果它们发生变化,则重构为单独的实体。

像往常一样,“最好”的取决于业务和技术环境。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top