轨。单个表中具有相同外键的多个实例

时间:2015-10-29 12:39:17

标签: ruby-on-rails database-design rails-models

我不确定如何建模以下要求:

我们向用户发送3种不同啤酒的包装。用户分为4类tasting_profiles。然后,我们为所有用户准备了4种不同的啤酒。然后用户对啤酒进行评级,这将定期发生。

注意:我主要担心的是我有一个表(Packs)可能有多个相同外键的实例。每包装包含3种啤酒。

目前我有以下型号:

用户/啤酒/个人资料/打包/评级

class User < ActiveRecord::Base
  belongs_to :profile 
  has_many :ratings # A user rates every beer received.
  has_many :beers, through: :ratings
end

class Beer < ActiveRecord::Base
  has_many :ratings
  has_many :users, through: :ratings
  has_many :packs
end

class Profile < ActiveRecord::Base
  has_many :packs #we setup and send periodic packs for each tasting_profile (Profile)
  has_many :users #each tasting profile has many users
  has_may :beers #each tasting profile has many possible beers
end

class Pack < ActiveRecord::Base
  belongs_to :beer #Not sure
  belongs_to :profile
end

class Rating < ActiveRecord::Base
  belongs_to :user
  belongs_to :beer
end

包模型问题: 我的第一个选择是在Pack模型中包含以下字段:

  1. pack_id
  2. profile_id(FK)
  3. beer_id(FK1)
  4. beer_id(FK2)
  5. beer_ip(FK3)
  6. delivery_month
  7. 这样我就有了一个完整的包装。

    在这里研究我读到这显然是一种不好的做法,只有一个入口FK被建议。像这样:

    1. pack_id
    2. profile_id(FK)
    3. beer_id(FK)
    4. delivery_month
    5. 在这种情况下,我会为每个包装有3个条目。

      最后我正在考虑研究一个数组字段(不确定是否可以用外键完成):

      1. pack_id
      2. profile_id(FK)
      3. 啤酒[beer_id1,beer_id2,beer_id3]#或哈希[beer_1:beer_id,beer_2:..]
      4. delivery_month
      5. 创建包后,我需要根据用户数量,根据需要使用以下多个条目填充评级表。如果我在tasting_profile中有100个用户,我会向他们发送3个啤酒包,这里有300个条目

        1. rating_id
        2. User_id(FK)
        3. beer_id(FK)
        4. DELIVERY_DATE
        5. 我真的很困惑如何正确建模。 ¡我会感谢任何可能的帮助!我试着尽可能详细。如果您需要进一步澄清,请与我们联系。

          先谢谢!!

1 个答案:

答案 0 :(得分:0)

我花了很多时间,但比预期的要简单。一旦我在同一个表中需要同一个foreign_id的多个实例,我应该很清楚我需要另一个连接表。

首先我尝试使用has_and_belongs_to_many关联,但是我在删除连接表中的“关联”条目时遇到了问题。所以我结束了一个has_many Trough。这些是变化:

System.out.println("Please enter the number of judges.");  
do
{
    System.out.println("Please ensure the number you entered is between 3 and 6");
    while(!scan.hasNextInt())
    {
        scan.nextLine();
        System.out.println("Please ensure the number you entered is a number");
    }
    numJudges = scan.nextInt();

} while (!(numJudges >=3 && numJudges<=6));

一切正常!