Rails มี _many พร้อมชื่อแทน


186

ในรุ่นผู้ใช้ของฉันฉันสามารถมี:

has_many :tasks

และในรูปแบบงานของฉัน:

belongs_to :user

จากนั้นหากว่าคีย์ต่างประเทศ 'user_id' ถูกเก็บไว้ในตารางงานฉันสามารถใช้:

@user.tasks

คำถามของฉันคือฉันจะประกาศความสัมพันธ์ has_many ได้อย่างไรซึ่งฉันสามารถอ้างถึงงานของผู้ใช้เป็น:

@user.jobs

... หรือ ...

@user.foobars

ขอบคุณมาก


7
ฉันเหนื่อยกับการใช้งานเป็นชื่อคลาส - เป็นคำที่สงวนไว้สำหรับ Rails และอาจทำให้เกิดปัญหาแปลก ๆ ตามถนน: reservedwords.herokuapp.com
Joshua Pinter

คำตอบ:


361

ลองยิงดู:

has_many :jobs, foreign_key: "user_id", class_name: "Task"

ทราบว่า:asจะใช้สำหรับสมาคม polymorphic


1
ขอบคุณสำหรับการรวมถึงคีย์ต่างประเทศ - แก้ไขปัญหาที่คล้ายกัน แต่แตกต่างกันของฉัน
Niels Abildgaard

4
สิ่งนี้ต้องการอะไรเป็นพิเศษในฝั่งงานหรือว่าปกติbelongs_toเพียงพอหรือไม่
ดาวรุ่ง

1
FYI: สิ่งนี้ใช้ได้กับการเชื่อมโยง has_and_belongs_to_many โดยไม่จำเป็นต้องมีส่วน "foreign_key" เท่านั้น
David Moritz

55

คุณสามารถใช้alias_attributeหากคุณยังต้องการอ้างถึงงานเหล่านั้นด้วย:

class User < ActiveRecord::Base
  alias_attribute :jobs, :tasks

  has_many :tasks
end

3

หากต้องการตอบ @ SamSaffron ให้สมบูรณ์:

คุณสามารถใช้class_nameกับทั้งหรือforeign_key inverse_ofโดยส่วนตัวแล้วผมชอบการตีความที่เป็นนามธรรมมากกว่า แต่โดยส่วนตัวแล้วมันเป็นเรื่องของรสนิยม:

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

และคุณต้องแน่ใจว่าคุณมีแอbelongs_toททริบิวในโมเดลย่อย:

class BlogPostImage
  belongs_to :blog_post
end

0

หากคุณใช้ has_many ผ่านและต้องการนามแฝง:

has_many :alias_name, through: model_name, source: initial_name

-61

คุณสามารถทำได้สองวิธีที่แตกต่างกัน หนึ่งคือโดยใช้ "เป็น"

has_many :tasks, :as => :jobs

หรือ

def jobs
     self.tasks
end

เห็นได้ชัดว่าคนแรกจะเป็นวิธีที่ดีที่สุดในการจัดการกับมัน


ขอบคุณที่ฟังดูสมบูรณ์แบบ น่าเสียดายที่นี่ใช้งานไม่ได้: USER MODEL: has_many: task, as =>: created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError ใน TasksController # index วิธีที่ไม่ได้กำหนด `created_tasks 'สำหรับ # <ผู้ใช้: 0xb6050b5c>
doctororange

4
วิธีที่สองค่อนข้างมีประโยชน์มากสำหรับการสร้างนามแฝงของการเชื่อมโยง
jpgeek

สิ่งนี้ดูเหมือนจะไม่เหมาะสมอย่างที่แซมพูดในฐานะ: สำหรับสมาคมที่มีความหลากหลาย
Michael K Madison
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.