Rails用户配置文件设计:has_many或:has_many_through关系

时间:2013-05-30 21:27:13

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

我正在开始思考如何在我的项目中开始设置以下一组模型关系。我不是在寻找完整的解决方案(模型,表格,迁移等),只是帮助我朝着正确的方向前进。我通过自己的努力学到了更多:)

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

至于设置,我需要:

  • 5个表(3个主要表和2个连接表)?
  • 只有三个(主要三个型号)?
  • 四个(主要三个型号和InclinationsInclinationData的加入表)?
  • 四个(主要三个型号和Users& Inclinations的加入表)?
  • 也许更简单的事情就像绑定到Profile的单个PreferencesUser模型一样?

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

感谢您的帮助,如果您需要更多信息可以帮助我,请与我们联系。

2 个答案:

答案 0 :(得分:1)

我想我已经通过你的要求推理了:

用户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

答案 1 :(得分: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提取说明(即构建评级表单),并将个人评分存储起来<​​/ p>

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