7

Tôi đã ba mô hình, từng có các hiệp hội sau:Thiết lập một: has_many: thông qua hiệp hội về một hiệp hội belongs_to Ruby on Rails

class Model1 < ActiveRecord::Base 
    has_many :model2s 
    has_many :model3s 
end 

class Model2 < ActiveRecord::Base 
    belongs_to :model1 
    has_many :model3s, :through => :model1 # will this work? is there any way around this? 
end 

class Model3 < ActiveRecord::Base 
    belongs_to :model1 
    has_many :model2s, :through => :model1 # will this work? is there any way around this? 
end 

Như bạn có thể nhìn thấy trong văn bản nhận xét, tôi đã đề cập đến những gì tôi cần .

Trả lời

6

Bạn chỉ cần tạo phương pháp này để truy cập vào nó

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    def model3s 
    model1.model3s 
    end 
end 

Hoặc, bạn có thể uỷ thác cho MODEL1 các model3s phương pháp

class Model2 < ActiveRecord::Base 
    belongs_to :model1 

    delegate :model3s, :to => :model1 

end 
+0

phần ủy quyền cung cấp cho tôi lỗi này "Phái đoàn cần mục tiêu. Cung cấp một băm tùy chọn với: để khóa làm đối số cuối cùng (ví dụ: đại biểu: hello,: to =>: greeter).". Hãy để tôi thử phương pháp phần – Rohit

+0

Cách đầu tiên là làm tốt và giải quyết vấn đề của tôi. Nhưng hãy tìm một số chỉnh sửa trong cơ chế ủy quyền và chỉnh sửa câu trả lời. : D – Rohit

+0

sử dụng đại biểu: model3s,: to =>: model1 thay vì ủy quyền: model3s,: as =>: model1. : D làm việc cho tôi – Rohit

0

Tại sao không thử:

class Model1 < ActiveRecord::Base 
    has_many :model2s 
    has_many :model3s 
end 

class Model2 < ActiveRecord::Base 
belongs_to :model1 
has_many :model3s, :primary_key => :model1_id, 
         :foreign_key => :model1_id 

end 

class Model3 < ActiveRecord::Base 
    belongs_to :model1 
    has_many :model2s, :primary_key => :model1_id, 
         :foreign_key => :model1_id 
end 

này sẽ có hoạt động ghi lại tham gia model2 và model3 bởi model1_id rời khỏi model1 hoàn toàn ra khỏi nó và nên hiệu quả hơn.

+1

Trong trường hợp chung này sẽ mất mọi điều kiện gắn liền với các định nghĩa "has_many" trong Model1. ví dụ. nếu Model1 được định nghĩa với 'has_many: model2s, -> {where deleted: false}' bạn sẽ không chọn các điều kiện đó mà không cần viết một số mã phụ có khả năng mong manh và/hoặc tiết. Chỉ cần một cái gì đó để được nhận thức. –