我正在为一个应用程序添加一个投票和业力/声誉系统(类似于这里,HN 等),并决定制作我自己的,因为现有的 gem 都没有我想要的所有功能。在处理基本功能时,我最终在我的模型中编写了一些非常复杂的关联,并且不确定这与编写我自己的方法(或范围)以返回相同的数据相比如何。
伪代码如下。(用户可以对问题和答案进行投票,但用户也可以通过他们发布的 Q/A 进行投票和反对)
User
has_many :questions
has_many :answers
has_many :votes
has_many :question_up_votes, through: :questions, source: :vote,
conditions: {voteable_type: :question, 'score > 0'}
has_many :question_down_votes, through: :questions, source: :vote,
conditions: {voteable_type: :question, 'score < 0'}
has_many :answer_up_votes, through: :answers, source: :vote,
conditions: {voteable_type: :answer, 'score > 0'}
has_many :answer_down_votes, through: :answers, source: :vote,
conditions: {voteable_type: :answer, 'score < 0'}
Question
belongs_to :user
has_many :questions
has_many :votes, as: :voteable
Answer
belongs_to :user
belongs_to :question
has_many :votes, as: :voteable
Vote
belongs_to :voter, class_name: "User"
belongs_to :voteable, polymorphic: true
belongs_to :user, through: :voteable
attr_accessible :score, :user_id, :voteable_type, :voteable_id
具体来说,对于 User 模型中的四个复杂关联,写一些返回相同信息的方法(或作用域),无论是在 User 模型中还是在 Q/一个模型?
我对 Rails(和编程)非常陌生,这是我的第一个 Stack Overflow 问题,非常感谢您的温柔。让我知道这个问题是否更适合不同的 Stack 属性。谢谢!