1

我已经阅读了在 Rails 网站上的选择has_many :throughhas_and_belongs_to_many,但是我有点困惑,因为我的案例与网站上给出的案例不同。

我有两个模型:PropCharacterCostume,并且角色的服装可以有多个与之关联的道具,但是道具不属于该角色,并且它也可以被场景中的任意数量的角色使用。

现在我has_and_belongs_to_many :props在我的CharacterCostume模型里面,它完全符合我的要求:它使用character_costumes_props我调用时命名的表来获取与服装相关的所有道具CharacterCostume#props

然而,由于“属于许多人”的部分,协会名称让我望而却步。服装不属于任何道具,所以模型has_and_belongs_to_many :character_costumes内部没有Prop

我知道没有它它都可以正常工作,但它让我想到也许我应该使用has_many :through关联,但这需要我创建一个多余的模型(这是多余的,对吧?),模型看起来像这样:

class CharacterCostumeProp < ActiveRecord::Base
  belongs_to :character_costume
  has_one :prop
end

另外,has_one不是在belongs_to这里工作吗?

我希望代码尽可能语义化,但我不确定这是否会增加对资源的需求或以某种方式降低性能,因为有一个中间模型。

这两种方法是否有某些怪癖/好处?我的够好吗?还是我的想法与我需要做的完全错误?

谢谢!

4

3 回答 3

2

在决定使用 HABTM 时,您必须问自己的一个最重要的问题has_many :through是:

我想存储任何特定于关联的信息吗?

示例 1:杂志订阅

读者和杂志之间的多对多关系可以想象为 HABTM 或has_many :through. 然而,后者在这种情况下更有意义,因为我们可以很容易地想到特定于我们可能想要存储的关联的信息。

读者通过订阅与杂志相关联,每一次订阅都可以通过价格、开始日期、发行频率、是否活跃等字段来描述。

示例 2:标签

现有Tag模型与模型之间的关系Article显然是多对多类型的。一个特定标签已与任何特定文章相关联这一事实一定不会影响同一标签将来是否能够类似地与其他文章相关联。

但是,与前面的示例不同,这里的关联本身就是我们需要的所有信息。我们只需要知道哪些标签与任何给定的文章相关联。协会成立时间无关紧要。持续多久并不重要。

一个标签与多少篇文章相关联对我们来说可能很重要。但是该信息存储在Tag模型中,因为它不是特定于关联的。甚至还有一个 Rails 功能可以解决这个问题,称为counter_cache.

于 2013-06-10T00:58:25.380 回答
2

我认为您想使用 a:has_many, :through因为您将要直接使用关系模型-什么场景,消耗或损坏等。

但是,它读起来很有趣的原因是,在大多数情况下,has_manybelongs_to并不真正意味着它们在英语中的意思。他们真正的意思分别是“他们有外键”和“我有外键”;例外是:dependent => :destroy行为。

这仍然没有真正的帮助has_and_belongs_to_many,因为你然后说,“他们有外键,我有外键” - 除了你可以想到它在“我”和“它们”恰好是每个相同的部分,并且具有这些键。

这有帮助吗?

于 2013-06-10T01:01:14.837 回答
0
  1. has_one行不通,你需要belongs_to
  2. 如果您的关联模型中有逻辑,这不是多余的
  3. has_and_belongs_to_many 对你来说已经足够好了

请参阅下面的示例

class Student
  has_and_belongs_to_many :courses
  has_many :teachers, through: :courses
end

class Teacher
  has_many :courses
  has_many :students, through: :courses
end

class Course
  has_and_belongs_to_many :students
  belongs_to  :teacher

  def boring?
    teacher.name == 'Boris Boring'
  end
end

在上面的示例中,我使用了这两个版本。看看 Course 如何有自己的逻辑?看看 CourseStudent 的课程怎么可能没有?这就是一切。嗯,对我来说是。只要我has_many through不能为我的关联模型命名和/或模型不需要额外的逻辑或行为,我就会使用它。

于 2013-06-10T00:43:02.580 回答