【发布时间】:2018-11-16 15:28:46
【问题描述】:
我正在研究越来越深入的 RoRails,但我被我们提供给我的数据所困,以便在这个可爱的框架上重现。 让我先向您展示我的表格和模型关联。
create_table "skills", force: :cascade do |t|
t.string "name"
t.bigint "parent_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["parent_id"], name: "index_skills_on_parent_id"
end
create_table "skills_users", id: false, force: :cascade do |t|
t.bigint "skill_id", null: false
t.bigint "user_id", null: false
t.index ["skill_id", "user_id"], name: "index_skills_users_on_skill_id_and_user_id"
end
create_table "users", force: :cascade do |t|
t.integer "points"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
和模型:
class Skill < ApplicationRecord
validates :name, presence: true
has_many :children, class_name: "Skill", foreign_key: :parent_id
belongs_to :parent, class_name: "Skill", foreign_key: :parent_id, optional: true
has_and_belongs_to_many :users
end
class User < ApplicationRecord
validates :points, presence: true
has_and_belongs_to_many :skills
end
目标是对技能进行分类,获取技能子项并计算用户在每个父技能中的点数。这是一个数据示例
SKILLS
+-----------------------+
|ID|NAME |PARENT_ID|
+-----------------------+
|1 |Football | |
+-----------------------+
|2 |Basketball| |
+-----------------------+
|3 |Foot |1 |
+-----------------------+
|4 |Basket |2 |
+-----------------------+
|5 |Soccer |1 |
+-----------------------+
SKILLS_USERS
+-------------------+
|ID|SKILL_ID|USER_ID|
+-------------------+
|1 |1 |1 |
+-------------------+
|2 |1 |2 |
+-------------------+
|3 |3 |3 |
+-------------------+
|4 |2 |4 |
+-------------------+
|5 |5 |5 |
+-------------------+
USERS
+---------+
|ID|POINTS|
+---------+
|1 |100 |
+---------+
|2 |200 |
+---------+
|3 |100 |
+---------+
|4 |50 |
+---------+
|5 |10 |
+---------+
预期的请求应如下所示:
+--------------------------------+
|ID|NAME |POINTS|USERS_COUNT|
+--------------------------------+
|1 |Football |410 |4 |
+--------------------------------+
|2 |Basketball|50 |1 |
+--------------------------------+
我首先尝试用这个查询在纯 sql 中回答它:
SELECT id , Name , count ( points) as POINTS , count (USER_ID ) as USERS_COUNT
FROM SKILLS
INNER JOIN SKILLS as SK ON id = SK.parent_id
INNER JOIN SKILLS_USERS AS su ON su.skill_id = id
INNER JOIN USERS AS User ON SU.USER_ID = User.id
但似乎我在某个地方错了。
我认为 ActiveRecord 的方式很讨人喜欢,ruby 很神奇。什么是 ActiveRecord 方法可以通过连接表执行这种请求,并且我们只选择父技能?
【问题讨论】:
标签: sql ruby-on-rails relational-database