Giả sử tôi có một Khóa học trong đó Sinh viên có thể đăng ký thông qua tư cách thành viên (ví dụ: mối quan hệ has_and_belongs_to_many của khóa học và sinh viên). Một số thành viên là dành cho những sinh viên chỉ là quan sát các lớp học (không phải cho tín dụng, vv), vì vậy:Làm cách nào để tạo hồ sơ mới với has_many: thông qua và tôn vinh: điều kiện?
class Course < ActiveRecord::Base
has_many :memberships
has_many :students,
:through => :memberships
has_many :observers,
:through => :memberships,
:source => :student,
:conditions => { :memberships => { :observer => true }}
end
Đây là những gì các công trình lớn:
observers = Course.find(37).observers
Đây là những gì không làm việc:
new_observer = Course.find(37).observers.build(:name => 'Joe Student')
Tôi đã nghĩ rằng người ta có thể tạo hồ sơ mới bằng cách sử dụng liên kết và điều đó sẽ tạo ra:
- Một kỷ lục mới Student ('Joe Student')
- Một hồ sơ thành viên mới (course_id = 37, student_id = (joe), quan sát = true)
Nhưng thay vào đó tôi nhận được:
ActiveRecord::AssociationTypeMismatch: Membership expected, got Array
Tôi chắc chắn rằng tôi hoàn toàn nhầm lẫn về cách thức này và sẽ đánh giá cao bất kỳ thông tin chi tiết nào! Tôi cũng đã cố gắng làm điều này với các phạm vi có tên trên mô hình Thành viên, nhưng tôi dường như không thể có được has_many để sử dụng một phạm vi trong hiệp hội.
Cảm ơn bạn rất nhiều vì đã giúp đỡ!
Cảm ơn !! Rất hữu ích! Than ôi, vẫn chưa hoàn toàn 100%. Người quan sát boolean không được đặt trong sql: c.observers.create! (: Name => 'abby') => Tạo học sinh (2.0ms) CHERTN vào "sinh viên" ("tên", "updated_at", "created_at") VALUES ('abby', '2009-1 0-04 12:41:35', '2009-10-04 12:41:35') Tạo thành viên (0.0ms) INSERT INTO "thành viên" ("người quan sát", "updated_at", "student_id", "course_id", " created_at") GIÁ TRỊ (NULL, '2009-10-04 12:41:35', 4, 2, '2009-10-04 12:41:35') ** Lưu ý giá trị (NULL) cho người quan sát. – Eric
Câu hỏi ngu ngốc: vấn đề này vẫn còn hiện diện hoặc điều kiện băm hoạt động tốt khi xây dựng một bản ghi? (thiết lập 'người quan sát: true'). Hoặc có thể có một cách tốt hơn (chúng ta đang nói về đường ray4) –