Scoped find_or_create_by返回Nil而不是创建记录

时间:2018-06-14 19:56:36

标签: ruby-on-rails ruby

而不是创建记录,find_or_create_by只是返回nil。而且我不确定为什么。

我这样做:

current_store.jet.find_or_create_by(seller_id: seller_id) do |credentials|
  credentials.update_attributes(
  marketplace: marketplace,
  seller_id: seller_id,
  auth_token: auth_token)
end

它会返回此信息,而不是出于某种原因创建记录:

*** NoMethodError Exception: undefined method `find_or_create_by' for nil:NilClass

我已经检查了所有参数并且它们是正确的。但是确定还没有jet实例,但这就是重点。

My Jet表格如下:

create_table "jets", force: :cascade do |t|
  t.text "auth_token"
  t.text "marketplace"
  t.integer "store_id"
  t.boolean "three_speed"
  t.text "seller_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

我的current_store方法看起来像这样,并且正在返回正确的商店。

def current_store
  @current_store ||= Store.find(session[:fba_shipping_id])
end

我哪里误入歧途?

编辑: 以下是关于这些关系的更多信息..

class Store < ActiveRecord::Base
  has_one :jet
end

class Jet < ActiveRecord::Base
  belongs_to :store
end

2 个答案:

答案 0 :(得分:2)

由于你有一个has_one关联,所以编写方法可能更清楚如下:

Jet.find_or_create_by(store_id: current_store.id) do |jet|
  jet.seller_id = seller_id
  jet.marketplace = marketplace
  jet.auth_token = auth_token
end

在我看来,这将完成你想要做的事情,但是以更标准的方式。

请注意,这不会更新现有seller_id的属性(marketplaceauth_tokenjet),但会创建具有这些属性的属性(如果current_store尚未分配jet

即使记录已存在,您是否要更新这些属性?

Rails Documentation: find_or_create_by

答案 1 :(得分:1)

您目前的问题是

dmanna@ubuntu:~$ sudo pip install --no-index --find-links=pyt/pkg/patroni-1.4.4.tar.gz patroni[zookeeper]
Ignoring indexes: https://pypi.python.org/simple/
Downloading/unpacking patroni[zookeeper]
  Running setup.py (path:/tmp/pip_build_root/patroni/setup.py) egg_info for package patroni

  Installing extra requirements: 'zookeeper'
Downloading/unpacking urllib3>=1.19.1,!=1.21 (from patroni[zookeeper])
  Could not find any downloads that satisfy the requirement urllib3>=1.19.1,!=1.21 (from patroni[zookeeper])
Cleaning up...
No distributions at all found for urllib3>=1.19.1,!=1.21 (from patroni[zookeeper])
Storing debug log for failure in /home/dmanna/.pip/pip.log

返回current_store.jet ,因此nil

如果商店只有1 NoMethodError,那么Jet也只能拥有1 Store中的1 Seller

JetDocumentation)提供了构建器方法has_onebuild_association,因此您可以使用

create_association

但是,您可能需要确保current_store.create_jet(marketplace: marketplace, seller_id: seller_id, auth_token: auth_token) 还没有Store,例如

Jet

如果@HeliosdeGuerra在评论中指出您的意图,则不会更新现有的@jet = current_store.jet || current_store.create_jet(marketplace: marketplace, seller_id: seller_id, auth_token: auth_token) 。如果您真的想要使用这些方法并更新现有的Jet,那么您可以使用类似的东西:

Jet

但是,在这两种情况下,您应确保@jet = current_store.jet || current_store.create_jet(seller_id: seller_id) @jet.update_attributes(marketplace: marketplace,auth_token: auth_token) 已通过验证,例如

Jet