我需要使用哪些模型/关联来有效地实现此功能

时间:2013-06-15 14:01:16

标签: ruby-on-rails

我想知道你是否可以帮助我确定最佳关联,也许还有新模型用于我想要添加到现有应用程序的功能。该应用程序允许用户提出其他用户回答的问题。在发布问题时,用户指示它属于哪个省(因为问题是特定于位置的),并且用户还为问题选择一个或多个类别。因此,在创建问题之后,我能够获得类别(选择一个类别)和省级信息,如此

     def show      
       @question = Question.find(params[:id])
       puts @question.categories.first.id      #id = 2 for Tourism, for example
       puts @question.province_id     #id = 6 for Ontario, for example

     end

我想做的是让一些用户(回答问题)成为特色用户,他们的个人资料将显示在views / question / show页面的旁边。所以在问题展示行动中,根据上面的例子,我将查询安大略省旅游类别的特色用户。

考虑到应用程序的成千上万用户,但只有一小部分特色用户,我认为最好将这些信息存储在用户模型中,而是创建一个连接的feature_user模型他们的主要用户档案,一个省(他们是专家)和类别(他们是专家),但他们只有在同时匹配“省和类别”时才会被拉起来,因此,如果问题属于“旅游”类和省“安大略省”,那么其类别为“旅游”且省份为“安大略省”的特色用户将被提取。

如果我创建了一个feature_user模型,我应该使用这些其他模型创建哪些列和关联,以使其有效工作,和/或我应该向现有模型添加什么?我不确定我是否应该尝试使用一些has_and_belongs_to_many或has_many:通过或简单的外键。我的直觉是让它变得比它应该的更复杂。

现在

Province.rb
has_many :questions

Question.rb 
belongs_to :province
has_many :categorizations
has_many :categories, through: :categorizations

Category.rb

has_many :categorizations
has_many :questions, through: :categorizations

Categorization

belongs_to :question, touch: true
belongs_to :category, touch: true

User.rb
has_many :questions #i.e. questions they've asked
has_many :answers  #i.e. questions they've answered

1 个答案:

答案 0 :(得分:2)

我认为特色用户模型是最佳解决方案。这将所有特色用户逻辑封装在一个地方,您可以实现它而无需将属性列添加到其他模型(如您所说)仅用于极少数用户。以下是我将如何实现这一点:

# CreateFeaturedUsers (migration)
create_table :featured_users do |t|
  t.references :user
  t.references :province
  t.references :category
end

# FeaturedUser (model)
belongs_to :user
belongs_to :province
belongs_to :category

# User (model)
has_many :featured_users

# Question (model)
def featured_users
  User.joins(:featured_users).where(featured_users: {province: this.province, category: this.category})
end

然而,我会正确地将其命名为FeaturedUser,因为模型不代表用户,而只代表与用户的关系。也许Featuring会是一个更好的名字。