我正在为一个应用程序添加一个投票和业力/声誉系统(类似于这里,HN等),并决定自己创建,因为现有的宝石都没有我想要的所有功能。在处理基本功能时,我最终在模型中编写了一些非常复杂的关联,并且不确定这与编写自己的方法(或范围)以返回相同的数据相比如何。
下面的伪代码。 (用户可以在问题和答案上投票,但用户也可以通过他们发布的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 / A模型?
我对Rails(和编程)非常陌生,这是我的第一个Stack Overflow问题,所以很温柔。如果这个问题更适合不同的Stack属性,请告诉我。谢谢!