【发布时间】:2017-11-20 16:35:20
【问题描述】:
我正在制作一个用户可以完成任务的应用程序。这些任务有一个关联Requirements。 User 有一个关联 Qualifications
两者通过共享QualificationCategory连接
Task 有很多要求,User 有很多Qualifications。
需求的结构如下:
Requirement
- ID
- qualification_category_id
- task_type_id
- points_required
资格的结构如下:
Qualification:
- ID
- qualification_category_id
- user_id
- points
问题是这样的:
对于用户,我需要找到允许他完成的所有任务。所以我想从数据库中选择task_type.requirements 与user.qualifications 完全匹配的所有任务
因此,对于每个任务,检查要求是否与基于qualification_category 的任何用户资格相匹配,并且对于每个要求,检查相应的用户资格点是否高于或等于所需的点。
模型
class Requirement < ApplicationRecord
belongs_to :qualification_category
belongs_to :task_type, inverse_of: :requirements
end
class Task < ApplicationRecord
belongs_to :task_type
belongs_to :data_sourceable, polymorphic: true, optional: true
belongs_to :user_id, optional: true
belongs_to :solution, class_name: 'Hypothesis', optional: true
belongs_to :payment_period, optional: true
has_many :worker_groups, through: :task_type
has_many :requirements, through: :task_type
end
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :timeoutable, :confirmable, :lastseenable,
:recoverable, :rememberable, :trackable, :validatable, :registerable
has_and_belongs_to_many :roles
has_and_belongs_to_many :worker_groups
has_many :payment_periods
has_many :qualifications, inverse_of: :user
has_many :qualification_categories, through: :qualifications
end
class Qualification < ApplicationRecord
belongs_to :qualification_category
belongs_to :user, inverse_of: :qualifications
end
我如何编写我的 MySQL 查询或 ARel 语句来完成此操作。该应用程序将容纳数百万个任务,因此在 ruby 中这样做是不可取的。
【问题讨论】:
标签: mysql ruby-on-rails activerecord associations ruby-on-rails-5