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