【问题标题】:Rails user profile devise :has_many or :has_many_through relationshipsRails 用户配置文件设计:has_many 或 :has_many_through 关系
【发布时间】:2013-05-30 21:27:13
【问题描述】:

我正在为如何开始在我的项目中设置以下一组模型关系而绞尽脑汁。我不是在寻找完整的解决方案(模型、表格、迁移等),只是为了让我朝着正确的方向前进。我通过自己的努力学习更多知识:)

简而言之,我希望我的Users(使用 Devise 创建)有一组 Inclinations,代表他们对某些事物(即温暖的天气与寒冷的天气,观看体育赛事与参加体育赛事等)的偏好一个滑动刻度(编码 5 到 -5,不包括零)。每个Inclination(或InclinationData?)都将在一个单独的表中,并带有名称、描述等,所有Inclinations都会从该表中提取数据(所以我不会在整个申请中重复自己) .此外,默认情况下,每个User 将有一个Inclination 记录,每个InclinationData(?)

至于设置,我需要:

  • 5 个表(3 个主表和两个连接表)?
  • 只有三个(主要三个型号)?
  • 四个(主要三个模型和InclinationsInclinationData 的连接表)?
  • 四个(主要三个模型和UsersInclinations 的连接表)?
  • 也许更简单一些,比如绑定到 User 的单个 ProfilePreferences 模型?

我永远无法弄清楚如何决定是否需要连接表,这是我尝试过的最复杂的关联。

感谢您的帮助,如果您需要更多信息来帮助我,请告诉我。

【问题讨论】:

  • Inclination 和 InclinationData 模型有什么区别?
  • 每个用户都会有Inclination,他们的评分的实际记录,时间戳等。由于每个用户都会有相同的Inclinations集合,所以我想提取信息(名称,描述等)从不同的表中,并以某种方式将其链接到Inclination。这就是为什么我想知道我需要多少张桌子。这有意义吗?

标签: ruby-on-rails ruby-on-rails-3.2 rails-migrations model-associations rails-models


【解决方案1】:

你说,所有Users 都有同一套Inclinations。根据eabraham的说法,您可以将Inclinations的描述放在一个模型/表中,并将用户评分放在连接表UserInclination中:

class User < ActiveRecord::Base
  has_many :users_inclinations
  has_many :inclinations, through: :users_inclinations

end

class UsersInclination < ActiveRecord::Base
  belongs_to :users
  belongs_to :inclinations

  attr_accessible :user_id, :inclination_id, preference_score
end

class Inclination < ActiveRecord::Base
   has_many :users_inclinations

   attr_accessible :description, :name, :low_label, :high_label
end

因此,您可以从 Inclinations 中提取描述(即构建评分表)并将各个评分存储在

an_inclination= Inclination.find_by_name('weather')
user.user_inclination.create(inclination: an_inclination, preference_score: the_users_score)

【讨论】:

  • 太棒了!我喜欢您的解决方案甚至包括范围高端和低端的标签。正是我需要的,甚至没有要求。标记为答案:)
【解决方案2】:

我想我已经通过您的要求进行了推理:

用户 has_many UserInclinations 和 Inclinations has_one UserInclinations。大致上,模型应该如下所示:

class User < ActiveRecord::Base
  has_many :user_inclinations

  #default Devise attr_accessible
end

class UserInclinations < ActiveRecord::Base
  belongs_to :users
  belongs_to :inclinations

  attr_accessible :user_id, :inclination_id, preference_score
end

class Inclination < ActiveRecord::Base
  has_one :user_inclination

  attr_accessible :preference
end

【讨论】:

  • 谢谢你,它确实让我更接近了。令人困惑的部分是我在上面对您的评论中提到的。每个用户都将拥有相同的 Inclinations 集合,我正在尝试找到一种 DRY 方法来完成此操作。
  • 所以在我上面的例子中,固定的倾斜度集存储在倾斜度表中。 UserInclinations 表记录了每个用户的偏好得分。
  • 啊,有道理。我把它搞得太复杂了!让我试一试,我会看看我能做些什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多