繁体   English   中英

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

[英]What models/associations do I need to use to implement this feature efficiently

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

     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

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

考虑到有希望成千上万的应用程序用户,但只有一小部分特色用户,我不认为最好将这些信息存储在用户模型上,而是创建一个连接到他们主要的feature_user模型用户个人资料,一个省(他们是专家)和类别(他们是专家),但他们只有在同时匹配'省和类别'时才会被提取,所以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

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

# 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会是一个更好的名字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM