2011-10-05 34 views
5

Tôi đang theo dõi http://railscasts.com/episodes/102-auto-complete-associationRails 3 find_or_create_by

Mọi thứ đều ổn. Tôi đang cố gắng tạo hóa đơn và cũng là khách hàng khi đang bay. Nó hoạt động. Mọi thứ tuyệt vời.

client belongs_to chiếm hóa đơn belongs_to tài khoản hóa đơn belongs_to client

Buuut, cả hai mô hình (Client và Invoice) có một thuộc tính bắt buộc: ACCOUNT_ID.

Khi tôi đang cố gắng để tạo ra một khách hàng mới một cách nhanh chóng tôi nhận được một lỗi :client_id: - can't be blank

Lý do tôi nhận được lỗi này đó là bởi vì một khách hàng không thể được tạo ra bởi vì nó đòi hỏi một ACCOUNT_ID trong Mô hình khách hàng. Nếu tôi xóa dòng này validates :account_id, :presence => true trong mô hình Khách hàng thì hóa đơn sẽ được thêm nhưng Khách hàng không có account_id.

tôi có này trong clients_controller.rb trong tạo hành động để thiết lập một giá trị mặc định @client.account_id = current_user.account_id

invoice.rb

validates :account_id, :presence => true 
validates :client_id, :presence => true 

def client_name 
    client.name if client 
end 

def client_name=(name) 
    self.client = Client.find_or_create_by_name(name) unless name.blank? 
end 

Trả lời

4

kiểm tra những ghi-up trên giao diện truy vấn ActiveRecord cho Rails 3. x:

http://guides.rubyonrails.org/active_record_querying.html (xem phần "15 Dynamic Finders")

http://m.onkey.org/active-record-query-interface

Bạn sẽ cần phải tạo tài khoản trước, sau đó khách hàng, sau đó là hóa đơn - nếu không xác thực của bạn sẽ không thành công.

Tốt nhất là để tạo ra các khách hàng và hóa đơn thông qua cha mẹ của họ, ví dụ .:

a = Account.find(current_user.account_id) 

c = a.clients.create(:name => "new client") 
a.save # better "save" than sorry ;-) 

c.invoices.create(:invoice_date => Time.now) 
c.save 

tôi khuyên bạn nên chơi xung quanh với điều này trong cơ sở dữ liệu phát triển bằng cách sử dụng đường ray giao diện điều khiển, để bạn có được một cảm giác về nó.

+0

Tài khoản đã được tạo. Người dùng đã đăng nhập đã có account_id và có thể được truy cập như thế này 'current_user.account_id'. Vấn đề là nhận được cùng một account_id đó vào bản ghi khách hàng mới. Tôi sẽ chơi xung quanh với mã của bạn ngay bây giờ. – leonel

+2

Tôi có điều này trong mô hình hóa đơn của tôi 'def organization_name = (name); self.organization = Organization.find_or_create_by_name (tên); trừ khi name.blank ?; end' Không thể truy cập current_user trong mô hình. – leonel

+0

nếu bạn tạo bản ghi khách hàng mới bắt đầu từ bản ghi tài khoản, sau đó nó sẽ kế thừa nó là account_id ... xem ở trên. – Tilo