2009-12-11 29 views
19

Tôi mới sử dụng ROR và vẫn đang chơi với các liên kết. Tôi cần có hai tham chiếu đến một mô hình cụ thể trong một mô hình khác. Mã scaffolded không hoạt động và tôi nhận được một lỗi "uninitialized constant".Kết hợp đường ray cho hai khóa ngoại cho cùng một bảng trong một bảng

lệnh Generation:

script/generate scaffold BaseModel name:string 
script/generate scaffold NewModel name:string base1:references base2:references 
db:migrate 

mô hình tạo:

class NewModel < ActiveRecord::Base 
    belongs_to :base1 
    belongs_to :base2 
end 

class BaseModel < ActiveRecord::Base 
    has_many :new_models # I added this line 
end 

Khi tôi cố gắng tạo ra một new_model tại /new_models/new, tôi đã cố gắng cả ID và tên của BaseModel nhưng nó không hoạt động. Các lỗi tôi nhận được là:

uninitialized constant NewModel::Base1 

Tôi đoán nó ánh xạ tên, vì vậy trong tôi tạo ra phương pháp, tôi đã cố gắng để thiết lập một cách rõ ràng các trường hợp BaseModel:

@new_model = NewModel.new(params[:new_model]) 
@base1 = BaseModel.find(1) # this exists 
@base2 = BaseModel.find(2) # this exists 
@new_model.base1 = @base1 # This throws the same error as above 

Có điều gì tôi đang thiếu?

Trả lời

31

Hầu hết Rails 'ma thuật xuất phát từ quy ước về cấu hình. Bằng cách đặt tên mọi thứ theo hướng dẫn Rails có thể đoán được hầu hết các tùy chọn cấu hình. ActiveRecord :: Hiệp hội không có ngoại lệ.

Đối số đầu tiên của bất kỳ Hiệp hội ActiveRecord nào là tên sẽ được sử dụng trong mô hình. Đây thường là tên của một mô hình khác, đó là quy ước. Theo tên lớp mặc định là số ít tên liên kết trong camelcase. Khóa ngoài mặc định trong liên kết là tên liên kết được gắn với "_id". Nếu tên liên kết của bạn không khớp với tên lớp hoặc khóa ngoại theo các mẫu này, bạn sẽ cần cung cấp chúng làm tùy chọn.

này sẽ làm những gì bạn muốn:

class NewModel 
    belongs_to :base1, :class_name => "BaseModel" 
    belongs_to :base2, :class_name => "BaseModel" 
end 

Cá nhân tôi sẽ cung cấp cho các hiệp hội tên mô tả hơn là base1 và base2. Một cái gì đó như thế này:

Ratings bảng: id, rater_id, rated_id, giá

class Rating 
    belongs_to :rater, :class_name => "User" 
    belongs_to :rated_user, :class_name => "User", :foreign_key => "rated_id" 
end 

Một ví dụ khác nhau có thể đã được sử dụng, nhưng điều này đã được lựa chọn để làm nổi bật khi lựa chọn chính nước ngoài là cần thiết.

0

Biểu tượng được chuyển đến phương thức belongs_to cần phải là tên số ít của mô hình khác. Vì vậy, ví dụ của bạn, nó sẽ là:

class NewModel < ActiveRecord::Base 
    belongs_to :base_model 
end 
Các vấn đề liên quan