Ruby on Rails มีความสัมพันธ์มากมาย

ฉันยังใหม่กับ RoR และกำลังทำงานในโครงการแรกของฉัน แนวคิดพื้นฐานเบื้องหลังแนวคิดนี้คือการเชื่อมโยง "ผู้ใช้" ที่เลือกชุด "ทักษะ" กับผู้ใช้รายอื่นที่ได้ส่ง "คำร้องขอความช่วยเหลือ" ที่เกี่ยวข้องกับทักษะที่เลือกโดยเฉพาะ แอปที่เชื่อมต่อผู้ใช้ที่มีทักษะกับผู้ใช้ที่ต้องการความช่วยเหลือหากคุณต้องการ คำถามของฉันเกี่ยวข้องกับความสัมพันธ์ระหว่างผู้ใช้ ทักษะ และโมเดล Help_Request รู้สึกเหมือนมี "has_many :through association" หรืออาจจะเป็น "การเชื่อมโยงแบบ polymorphic" เพื่อให้เกิดความสัมพันธ์สามทางแบบนี้? ไม่แน่ใจจริงๆเหรอ?

ความคิดหรือข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก


person Flint285    schedule 07.11.2013    source แหล่งที่มา
comment
โครงสร้างที่ง่ายที่สุดคือ HABTM ระหว่างผู้ใช้/ทักษะ และคำขอช่วยเหลือ/ทักษะ ที่คุณเข้าร่วม   -  person Damien Roche    schedule 07.11.2013


คำตอบ (3)


ฉันเกรงว่าคำตอบของ ShivamD จะไม่เพียงพอ นั่นจะต้องมี Skills ซ้ำกัน และสอบถาม User.help_requests ที่เกี่ยวข้องผ่านความสัมพันธ์ โดยที่คุณต้องการจุดตัดแทน

ไม่เพียงเท่านั้น Users ที่สร้าง HelpRequests จะมีความสัมพันธ์ has_many อยู่แล้ว นั่นสมเหตุสมผลแล้ว

ฉันจะไม่รวมสคีมาสำหรับ HABTM ที่ฉันกำลังจะแนะนำ (ดู ที่นี่) แต่ฉันจะพูดถึงโมเดลต่างๆ โดยพื้นฐานแล้วสิ่งที่คุณต้องการ:

skill = Skill.create(name: "My Skill")
user.skills         << skill
help_request.skills << skill

user.matched_help_requests
#> [help_request]

ซึ่งสามารถทำได้ดังนี้

class User
  has_and_belongs_to_many :skills

  def matched_help_requests
    HelpRequest.joins(:skills).where("skills.id IN(?)", skills.pluck(:id))
  end
end

class HelpRequest
  has_and_belongs_to_many :skills
end

class Skill
  has_and_belongs_to_many :users
  has_and_belongs_to_many :help_requests
end

แก้ไข: นี่คือ schmea สำหรับ HABTM:

rails g migration add_skills_join_tables

ภายในการโยกย้าย

def change
  create_table :skills_users, id: false do |t|
    t.references :skill
    t.references :user
  end

  create_table :help_requests_skills, id: false do |t|
    t.references :skill
    t.references :help_request
  end

  add_index :skills_users,        [:skill_id, :user_id]
  add_index :help_request_skills, [:skill_id, :help_request_id] 
end
person Damien Roche    schedule 07.11.2013
comment
เพียงเพื่อชี้แจง. ในขณะที่ฉันกำลังตั้งค่าความสัมพันธ์ HABTM ฉันจะสร้างตารางรวมหนึ่งหรือสองตารางโดยไม่มีคีย์หลักหรือไม่ (ตามที่ระบุไว้ในเอกสารประกอบ) นอกจากนี้ คุณช่วยอธิบายวิธีการmatched_help_requestเพิ่มเติมอีกหน่อยได้ไหม ขอบคุณ Damien มาก ฉันซาบซึ้งมาก - person Flint285; 08.11.2013
comment
@ Flint285 คุณจะต้องใช้สองตารางเข้าร่วม ดูคำตอบของ tiagotex สองตารางที่คุณต้องการคือ skills_users และ help_requests_skills และไม่มีคีย์หลัก แต่มีดัชนี ฉันจะอัปเดตคำตอบเพื่อแสดงการโยกย้าย - person Damien Roche; 08.11.2013
comment
@ Flint285 อัปเดตคำตอบแล้ว อาจปรับปรุงวิธีการ matched_help_request ได้ สิ่งนี้จะรวบรวม ID ทักษะของผู้ใช้ผ่านทาง join table skills_users (skills.pluck(:id)) จากนั้นดำเนินการค้นหาแบบรวมโดยที่ HelpRequest รหัสทักษะตรงกัน - person Damien Roche; 08.11.2013
comment
ตกลง เตรียมสคีมาและโมเดลของฉันให้พร้อมใช้ คุณช่วยอธิบายวิธีการ Skill.create เพิ่มเติมอีกหน่อยได้ไหม และวิธีการดังกล่าวเหมาะสมกับคอนโทรลเลอร์และมุมมองอย่างไร ตามปกติแล้ว ขอบคุณ Damien มาก - person Flint285; 09.11.2013

การเชื่อมโยงแบบโพลีมอร์ฟิกคือเมื่อโมเดลควรเป็นของโมเดลอื่น สมมติว่าเมื่อคุณเป็นแบบอย่างความคิดเห็น คุณสามารถแสดงความคิดเห็นในโพสต์และแสดงความคิดเห็นได้ นั่นคือตอนที่คุณจะใช้โพลีมอร์ฟิก

ในกรณีของคุณ has_manythrough แบบง่าย ๆ ก็สามารถทำได้ มันควรจะเป็นแบบนี้

class User < ActiveRecord::Base 
  has_many :skills 
  has_many :help_requests, through: :skills
end

class Skill < ActiveRecord::Base 
  belongs_to :user
  belongs_to :helpRequest
end

class HelpRequest < ActiveRecord::Base 
  has_many :skills 
  has_many :users, through :skills
end

หากต้องการข้อมูลเพิ่มเติม โปรดไปที่เอกสาร

person ShivamD    schedule 07.11.2013

วิธีหนึ่งคือการสร้าง has_and_belongs_to_manyความสัมพันธ์ระหว่างผู้ใช้กับคำขอช่วยเหลือและทักษะ ดังนั้นคุณจะได้สิ่งนี้:

class User < ActiveRecord::Base
  has_and_belongs_to_many :skills
end

class Help_request < ActiveRecord::Base
  has_and_belongs_to_many :skills
end

class Skills < ActiveRecord::Base
      has_and_belongs_to_many :users
      has_and_belongs_to_many :help_requests
end

จากนั้นคุณจะต้องสร้างตาราง

 rails g migration add_skills_users_table

 rails g migration add_help_requests_skills_table

ในที่สุดก็วิ่ง rake db:migrate

จากนั้นคุณสามารถค้นหาโดยใช้ User.first.skills

person tiagotex    schedule 07.11.2013
comment
เพียงเพื่อชี้แจง. ในขณะที่ฉันกำลังตั้งค่าความสัมพันธ์ HABTM ฉันจะสร้างตารางรวมหนึ่งหรือสองตารางโดยไม่มีคีย์หลักหรือไม่ - person Flint285; 08.11.2013