Tôi chắc chắn sẽ viết xác thực cho việc này - dễ dàng hơn trong việc cung cấp thông báo lỗi tốt cho người dùng từ xác thực. Tôi cũng muốn sao lưu nó với một ràng buộc cơ sở dữ liệu. Có vẻ như ràng buộc kiểm tra thực sự có thể thực hiện công việc.
Rails không có hỗ trợ cho điều này mà tôi có thể tìm thấy, do đó bạn sẽ cần phải tạo bảng với sql thô. Bạn cũng sẽ cần phải thay đổi giản đồ dumper thành :sql
vì đường ray sẽ không thể tạo ra một schema.rb
mô tả điều này thực sự.
tôi đã viết di cư này
class CreateFoos < ActiveRecord::Migration
def change
execute <<SQL
CREATE TABLE foos (
id INTEGER PRIMARY KEY,
x_id INTEGER,
y_id INTEGER,
constraint xorit check((x_id OR y_id) AND NOT(x_id AND y_id))
)
SQL
end
end
Sau đó, trong đường ray console
Foo.create(:x_id => 1, :y_id => 1) #=> SQLite3::ConstraintException
Vì nó là bạn có thể tạo một hàng với không set x_id cũng không y_id. Bạn có thể thay đổi điều này bằng cách thay đổi chế,
(x_id IS NOT NULL OR y_id IS NOT NULL) AND (x_id IS NULL OR y_id IS NULL)
dường như làm việc cho tôi
Nguồn
2011-12-30 22:22:05
Cảm ơn bạn đã trả lời của bạn! Kết hợp với câu trả lời của @ Frederick, tôi sẽ nhận được một giải pháp hoàn chỉnh cho các câu hỏi của tôi. – Robin
Tôi đồng ý hơn với câu trả lời của @ mynameiscoffey. Chỉ có một cột cho khóa ngoài trong bảng 'A', do đó chúng ta có' imageable_id' và 'imageable_type' trong bảng A –