【问题标题】:Rails Model association typeRails 模型关联类型
【发布时间】:2012-05-18 00:18:49
【问题描述】:

我有以下表格:用户、朋友、兴趣和假期。这个应用程序的目的是记录用户的兴趣和他们庆祝的假期(包括朋友的生日、纪念日等)以及朋友的兴趣,以便我可以向他们发送相关内容的提醒。总之:

用户会有兴趣
用户将有朋友
朋友也会有兴趣
用户将有他们庆祝的假期(大约 10 个列表)
- 如果选择了母亲节、父亲节或情人节(在节假日),我还需要存储这些人的姓名和他们的兴趣

所以我想知道如何设置这些。棘手的是兴趣和假期。

兴趣应该是多态的,以便用户和朋友都可以访问吗?还是有很多 :through?

假期呢?这些将如何记录姓名和个人兴趣?

谢谢!我真的为这个而苦苦挣扎,可能事情过于复杂了..

【问题讨论】:

  • 如果我和我的朋友注册,我的朋友既是朋友又是用户? (即两个不同的模型)如果它们是不同的模型,那么兴趣肯定与用户和朋友有多态关系,假期可能有一个,但您只是指定假期与用户相关,而不一定是朋友。
  • 谢谢!不,该网站没有社交网络方面,用户是个人,与该网站的其他用户没有任何关系。 “朋友”的目的是让用户输入该人的生日日期,他们的兴趣,然后我将向他们发送与该朋友兴趣相关的优惠的提醒。与假期类似。如果用户选择“周年纪念日”,我会询问他们该人的姓名、日期和兴趣,以便我可以向他们发送相关优惠。有道理?非常感谢!
  • 好的,下一个问题 - 是否打算在用户之间共享兴趣,例如可以将单个兴趣记录连接到多个用户/朋友,或者兴趣只是字符串?
  • 嗯,有一个包含 30 个兴趣的列表,我将用这些列表为数据库播种.. 他们必须从该列表中选择,不能添加任何其他.. 但它们只是字符串,所以每条记录我猜会属于一个独特的用户吗?.. 谢谢
  • 没必要。 have_and_belongs_to_many 就是为了这个。将留下我将如何建模的答案。

标签: ruby-on-rails database ruby-on-rails-3 activerecord polymorphic-associations


【解决方案1】:

现在我想我明白你想要做什么,这就是我将如何建模:

User:

has_many :friends
has_many :person_interests, :as => :person
has_many :interests, :through => :person_interests
has_many :user_holidays
has_many :holidays, :through => :user_holidays

Friend:

belongs_to :user
has_many :person_interests, :as => :person
has_many :interests, :through => :person_interests

PersonInterest:

belongs_to :interest
belongs_to :person, :polymorphic => true

Interest:

has_many :person_interests
has_many :people, :through => :person_interests # may need an `inverse_of` here

UserHoliday:

belongs_to :user
belongs_to :holiday

Holiday:

has_many :user_holidays
has_many :users, :through => :user_holidays

通过这些设置,您应该能够执行您需要执行的查询。

【讨论】:

  • 谢谢,根据我之前的问题,“has_manyinterests, through => :person_interests”可以让我区分用户自己的兴趣,用户朋友的兴趣对吗?再次感谢!
  • 是的,您可以这样做,例如,@user.interests@user.friends.first.interests,它将按您的预期工作。
  • 不应该有 Person 模型吗? "belongs_to :person"
  • 不,不是多态关系。它只是可以连接到它的代表名称,在这种情况下可以是 UserFriend
  • 明白了..现在我明白了整个事情..完美。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多