2013-05-22 6 views
27

Envanter yönetimi için bir Rails frontend yazıyorum. Kullanıcıların ürünlerini kayıt edebilmek istiyorum, bu yüzden vardır:Raylar opsiyonel belongs_to

class User < ActiveRecord::Base 
    has_many :products 
    # <snip> 
end 

ve

class Product < ActiveRecord::Base 
    belongs_to :user 
    # <snip> 
end 

sorun ürünleri önce bir kullanıcı tarafından tescil edilen oluşturulan olmasıdır. Yani, Product.create'u aramak ve user_id'u nil'a ayarlamanız kesinlikle kabul edilebilir. Tahmin edebileceğiniz gibi olsa da, Raylar kutunun dışında bu desteklemez: Ben en çekici olan kludgey geçici çözümler, bir demet düşündüm

> Product.create! 
    (0.3ms) SELECT COUNT(*) FROM "products" WHERE "products"."type" IN ('Product') 
    (0.1ms) begin transaction 
    (0.1ms) rollback transaction 
ActiveRecord::RecordInvalid: Validation failed: User can't be blank 
    from ~/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/validations.rb:56:in `save!' 

bir NullUser sınıflara User ve kullanımı için ürünler yaratmak için. Ama bu hala bir kesmek gibi görünüyor. Bu Rails Yolu nedir?

Teşekkürler.


ilgili göç:

class AddUseridToProducts < ActiveRecord::Migration 
    def change 
    add_column :products, :user_id, :integer 
    end 
end 

ve üstü:

class Changeuseridtobeoptionalforproducts < ActiveRecord::Migration 
    def change 
    change_column :products, :user_id, :integer, null: true 
    end 
end 
+0

Lütfen "Ürün" modelinde sahip olduğunuz tüm doğrulamaları gönderin. –

cevap

4

Kullanıcının bulunmasını gerektiren bir doğrulama var mı? Öyleyse, bunu kaldırın. Biz belongs_to dernek tanımlamak her Raylar 5'te

belongs_to :user, optional: true 

, olması gerekir: Eğer bu tür davranışları istiyorsanız raylar 5 için

3

Raylar kesinlikle kutunun dışında bu destekler, sizin göçünü kontrol üzerinde bir sınırlama gibi :null => false dahil olması user_id hattı? Eğer öyleyse, çıkar onu!

Düzenleme: Veya @Rodrigo Dias durumları olarak, :null => true'a döndürün.

Ayrıca, Ürün modelindeki kullanıcı ilişkisine dair herhangi bir onayınız olmadığını kontrol edin.

+1

veya sadece şu konuma geçin: null => true –

+0

Aktarımı OP'ye ekledim (satır sonları ölene kadar buraya yapıştırmayın). – tsm

+0

"change_column: products,: user_id,: integer, null: true" ile bir geçiş yaptım, ancak bu hiçbir şey yapmadı. – tsm

108

Sadece bir güncelleme, bu seçeneği geçmesi gerekecektir ilişkili kayıt varsayılan olarak mevcut.

+1

Ughhh ... hepimiz notları okumalıyız ... doğru ? –

+0

Bunu raylar 5'de denedim, isteğe bağlı görüyorum, ama sorun, yabancı anahtar alanında varolan bir değeri girersem bunu kabul eder. Bu durumda, birincil tabloda bulunmayan bir hata ortaya çıkarmalıdır. Peki bunu nasıl düzeltebilirim? –

+0

Bunu aslında herhangi bir ilişki ile yapabilirsiniz, bir sayı ya da sıfır değilse, koyduğunuz her şeyin bir to_i yapmaya çalışacağına inanıyorum. Ait_to'nun sağladığı örnek yöntemleri kullanmanız, bu yöntemle ilişkilendirmeler oluşturmanız yanlış değerleri önleyecektir, Association.users.build ve User öğesini kullanmalısınız.build_association ayrıca mevcut olmayan kayıtları önlemek için ilişkiliydi, benim durumumda, isteğe bağlı true kullanıyorum ilişkili kullanıcı için belirli bir kayıt için, bu kayıt konuk kullanıcıları kabul ediyor, bu yüzden ben sadece Association.user = current_user yapıyorum current_user bir hatayı alamayacağım – Alexis