8

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:

  1. Một kỷ lục mới Student ('Joe Student')
  2. 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 đỡ!

Trả lời

6

Tôi tin rằng bạn đã gặp lỗi Rails. Tôi đã thử điều tương tự trên hộp của tôi (2.3.4) và nó mang lại cho tôi những lỗi tương tự mà không có vẻ gì cả. Ngoài ra tôi cũng đã cố gắng làm việc xung quanh của:

course = Course.first 
course.observers << Student.create(:name => "Joe Student") 
course.save 

Nhưng điều này tạo ra một thành viên với các thiết lập hiện trường quan sát để sai!

Cách giải quyết xấu xí cuối cùng tôi đã đưa ra đã tạo ra kỷ lục Membership bằng tay:

Membership.create!(:course => Course.first, :student => Student.first, :observer => true) 

Tôi đã created a ticket for this và tôi sẽ tiếp tục điều tra sau khi ăn sáng.

EDIT: Tôi đã, như đã hứa, tiếp tục điều tra và tìm thấy nếu bạn thay đổi :conditions Hash của bạn đến một mảng như:

:conditions => ["memberships.observer = ?", true] 

Nó hoạt động như dự kiến. Tôi cũng có một số github repository với mã ví dụ và hướng dẫn để sao chép.

+0

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

+0

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) –

Các vấn đề liên quan