2014-10-26 39 views
12

Đơn giản chỉ cần cố gắng để tiết kiệm với ActiveRecord và nó tôi tiếp tục nhận được "Lỗi Loại: nil không phải là một biểu tượng"Lỗi Loại: nil không phải là một biểu tượng

if card_data[:card] and card_data[:deck] 
    e = self.find_or_create_by(card_id: card_data[:card].id, deck_id: card_data[:deck].id, main: main) 
    e.card = card_data[:card] 
    e.deck = card_data[:deck] 
    e.quantity = card_data[:quantity].to_i 
    e.main = main 
    p e 
    e.save if e.card and e.deck 
end 

tôi chạy đoạn mã trên.

Schema:

create_table "entries", id: false, force: true do |t| 
    t.integer "card_id" 
    t.integer "deck_id" 
    t.integer "quantity", default: 0, null: false 
    t.integer "main",  default: 0, null: false 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Khi tôi sử dụng nâng lên, nó sẽ không cho phép tôi e.save thậm chí ngay sau khi tôi find_or_create_by.

#<Entry card_id: 1, deck_id: 1, quantity: 4, main: 1, created_at: "2014-10-26 00:45:12", updated_at: "2014-10-26 00:45:12"> 
(0.2ms) BEGIN 
(0.2ms) ROLLBACK 
TypeError: nil is not a symbol 
from /home/kevin/.rvm/gems/ruby-2.1.2/gems/activemodel-4.1.6/lib/active_model/dirty.rb:162:in `attribute_was' 

Vui lòng trợ giúp. Tôi đã dành hàng giờ cho việc này. Tôi đã cố gắng mysql insteal của sqlite. Tôi đã thử các kiểu dữ liệu cột khác nhau. Vấn đề là trường 'số lượng'. Nó sẽ không để tôi cứu.

Chỉnh sửa: biến 'chính' được đặt phía trên nội dung được hiển thị.

+1

Là một sang một bên, bạn không nên sử dụng 'and' và 'hoặc' thay cho' && 'và' || '. Chúng không giống nhau. Xem https://github.com/bbatsov/ruby-style-guide#no-and-or-or – meagar

Trả lời

29

Ok cuối cùng tôi đã tìm thấy câu trả lời. Tôi đã tạo bảng tham gia, 'mục' không có trường id. Điều này là bắt buộc nếu sử dụng bảng nối làm mô hình với dữ liệu bổ sung trên đó.

+1

Tài liệu này có ở bất kỳ đâu không? Tôi đã thử làm như vậy với các bảng tham gia của tôi, nhưng tôi vẫn nhận được lỗi tương tự. Ngoài ra, bạn có lẽ nên chấp nhận câu trả lời của riêng bạn. –

+2

Điều này được đề cập ở đâu đó trong bất kỳ tài liệu nào mà tôi đã đọc, và tôi đã googled điều này rộng rãi như tôi đã bị cản bởi vấn đề này trong hai ngày qua. Tôi đã có một bảng tham gia đang sử dụng 'has_and_belongs_to_many' cho liên kết mà tôi đã di chuyển sang' has_many: through'; bảng kết nối vẫn không có bất kỳ 'id' nào, vì vậy bất kỳ nỗ lực nào để cập nhật bản ghi đều không thành công. Bây giờ tôi biết tại sao điều này xảy ra và tôi hy vọng rằng Google sẽ mang đến cho người khác cùng một vấn đề ở đây như kết quả số 1. –

+2

Ngoài ra, nếu bạn không muốn thêm khóa chính, bạn có thể sử dụng phương thức 'update_all' - [xem tại đây] (http://stackoverflow.com/questions/13263188/how-do-you-update-a- join-table-record-với-no-primary-keys-in-rails). Nếu bạn đang cố gắng cập nhật một bản ghi cụ thể, bạn có thể thực hiện mệnh đề 'where' trước, sau đó' update_all'. – Robert

1

Đối với những người bạn đến đây và cần phải thêm khóa chính, bạn có thể làm điều đó trong một sự chuyển đổi như thế này:

class AddIdToMyTable < ActiveRecord::Migration def change add_column :my_table, :id, :primary_key end end

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