2013-12-14 2 views
0

У меня есть этот код: РельсыРубин на Rails: ActiveRecord :: StatementInvalid не может бросить ActiveRecord :: StatementInvalid

def newfood 
    memberproduct = MemberProduct.new 
    memberproduct.product_id = Product.where(:barcode_number => params[:barcode_number]).id 
    memberproduct.expiration_date = params[:expiration_date] 
    memberproduct.member_id = current_member.id 
    memberproduct.save 
end 

мне нужен идентификатор продукта. 3-я строка неверна.

У меня есть MemberProduct стола с product_id поля, в expiration_date поле и member_id поля (current_member происходит от devise) У меня есть Product таблицы с полем barcode_number и name поля.

Я получаю эту ошибку:

ActiveRecord::StatementInvalid in FoodController#newfood TypeError: can't cast ActiveRecord::Relation::ActiveRecord_Relation_Product to string: INSERT INTO "member_products" ("created_at", "expiration_date", "member_id", "product_id", "updated_at") VALUES (?, ?, ?, ?, ?)

Что я делаю неправильно?

ответ

1

Попробуйте

memberproduct.product = Product.where(:barcode_number => params[:barcode_number]).first 

memberproduct.product_id является столбец базы данных, где Rails хранит идентификатор продукта, связанный с вашим memberproduct. Обычно они не используются напрямую; вместо этого имя ассоциации.

Так обе эти работы:

def newfood 
    memberproduct     = MemberProduct.new 
    product      = Product.where(:barcode_number => params[:barcode_number]).first 
    memberproduct.product   = product 
    memberproduct.expiration_date = params[:expiration_date] 
    memberproduct.member   = current_member 

    memberproduct.save 
end 

и

def newfood 
    memberproduct     = MemberProduct.new 
    product      = Product.where(:barcode_number => params[:barcode_number]).first 
    memberproduct.product_id  = product.id 
    memberproduct.expiration_date = params[:expiration_date] 
    memberproduct.member_id  = current_member.id 

    memberproduct.save 
end 

но первая форма является более распространенным явлением. Если вы назначаете такой объект, как product или member, Rails достаточно умен, чтобы запросить объект для его идентификатора и использовать его автоматически.

Также, Product.where потенциально возвращает несколько результатов. Поскольку вы только ожидаете, добавьте .first, чтобы вернуть только первое совпадение.

+0

Спасибо, а что, если мне нужно получить идентификатор этого продукта? Будет обновлен вопрос. – hansottowirtz

+0

Я не уверен, что понимаю - у вас есть продукт. Если вам действительно нужен идентификатор модели, вы можете делать то, что вы делаете с 'current_member.id', и добавлять' .id' после '.first'. – janfoeh

+0

Это, наверное, глупая ошибка, но у меня есть этот код прямо сейчас: «продукт = Product.where (: barcode_number => Params [: barcode_number]). Первый memberproduct = MemberProduct.new memberproduct.product_id = product.id memberproduct.expiration_date = params [: expiration_date] memberproduct.member_id = current_member.id memberproduct.save ' И это говорит о неопределенном методе 'id' для nil: NilClass Но спасибо уже! – hansottowirtz

1

В зависимости от версии Rails, вы должны быть в состоянии:

Rails 3: Product.find_by_barcode_number(params[:barcode_number])

Rails 4: Product.find_by(barcode_number: params[:barcode_number])

Вы можете упростить свои действия, как так:

mprod = current_member.build_member_product(expiration_date: params[:expiration_date]) 
mprod.product = Product.find_by(barcode_number: params[:barcode_number]) 
mprod.save 

Хотя вы, вероятно, хотите иметь дело с проверками и т. Д. (if mprod.save .. else)

+0

Я уже нашел его, но спасибо за форматирование вопроса! Если бы у меня было более 15 репутации, я бы, конечно, проголосовал, lol. – hansottowirtz

+0

@xprise haha! Не беспокойся. –

Смежные вопросы