我正在尝试打开我的 MongoDB 模型,但是出现以下错误:
MONGODB | xxx.xx.x.xxx:27017 | db.find | FAILED | wrong number of arguments (given 2, expected 1) | 0.013306s
我的 Mongo 凭据是正确的,并且我可以连接到 Rails 外部的数据库集合。
错误的前几行是:
Started GET "/admin/xsl_sheet" for xxx.xxx.xxx.xxx at 2020-03-03 13:49:54 UTC
Processing by RailsAdmin::MainController#index as HTML
Parameters: {"model_name"=>"xsl_sheet"}
(5.0ms) SELECT `companies`.`name` FROM `companies` WHERE `companies`.`id` = 4
CACHE (0.1ms) SELECT `companies`.`name` FROM `companies` WHERE `companies`.`id` = 4 [["id", "4"]]
CACHE (0.2ms) SELECT `companies`.`name` FROM `companies` WHERE `companies`.`id` = 4 [["id", "4"]]
MONGODB | xxx.xx.x.xxx:27017 | …Run Code Online (Sandbox Code Playgroud) 我正在使用Rails 3 w/Mongoid,(所以没有ActiveRecord).Mongoid使用ActiveModel的"to_json"方法,默认情况下该方法包含JSON中的根对象(我不想要).
我试过把它放在初始化器中:
ActiveModel::Base.include_root_in_json = false
Run Code Online (Sandbox Code Playgroud)
但得到错误
uninitialized constant ActiveModel::Base
Run Code Online (Sandbox Code Playgroud)
我有什么想法可以改变这个吗?我直接在源代码中更改了默认值并且它工作正常,但显然我想要正确地执行它.
该变量在此文件的顶部定义: Github - activemodel/lib/active_model/serializers/json.rb
从文档:"选项ActiveModel :: Base.include_root_in_json控制to_json的顶级行为.默认情况下是真的."
有没有一种简单的方法来获取Mongoid文档的所有属性,包括嵌入文档的属性?
例如,如果我有以下文件:
class Person
include Mongoid::Document
embeds_many :phone_numbers
field :name
end
class PhoneNumner
include Mongoid::Document
embedded_in :person, :inverse_of => :phone_numbers
field :number
end
Run Code Online (Sandbox Code Playgroud)
我想获得这样Person的属性和电话号码:
{ :name => "Jenny", :phone_numbers => [{ :number => '867-5309' }, { :number => '867-5309' }] }
Run Code Online (Sandbox Code Playgroud) 我正在尝试为订阅服务测试相关文档.每个订阅都嵌入在一个帐户中并引用一个计划.以下是各种代码:
帐户:
Factory.define :account, :class => Account do |a|
a.subdomain 'test'
a.agents { [ Factory.build(:user) ] }
a.subscription { Factory.build(:free_subscription) }
end
Run Code Online (Sandbox Code Playgroud)
订阅:
Factory.define :free_subscription, :class => Subscription do |s|
s.started_at Time.now
s.plan { Factory.build(:free_plan) }
end
Run Code Online (Sandbox Code Playgroud)
计划:
Factory.define :free_plan, :class => Plan do |p|
p.plan_name 'Free'
p.cost 0
end
Run Code Online (Sandbox Code Playgroud)
错误:
Mongoid::Errors::InvalidCollection: Access to the collection for Subscription is not allowed since it is an embedded document, please access a collection from the root document.
Run Code Online (Sandbox Code Playgroud)
如果我注释掉将计划链接到订阅的行,那么测试就可以工作,但显然我无法测试订阅是否有计划.
任何建议将不胜感激.
更新:
以下是模型:
class …Run Code Online (Sandbox Code Playgroud) 我想从mongoid中使用这个函数:
person.update_attributes(first_name: "Jean", last_name: "Zorg")
Run Code Online (Sandbox Code Playgroud)
但我想从另一个变量传递所有属性.我怎么做?
编辑:谢谢大家的回复.我是红宝石的新手,所以起初我以为我犯了一个愚蠢的错误.错误是在一个完全不同的地方,正确的代码,为您的乐趣:
def twitter
# Scenarios:
# 1. Player is already signed in with his fb account:
# we link the accounts and update the information.
# 2. Player is new: we create the account.
# 3. Player is old: we update the player's information.
# login with a safe write.
puts "twitter"
twitter_details = {
twitter_name: env["omniauth.auth"]['user_info']['name'],
twitter_nick: env["omniauth.auth"]['user_info']['nickname'],
twitter_uid: env["omniauth.auth"]['uid']
}
if player_signed_in?
@player = Player.find(current_player['_id'])
else
@player = Player.first(conditions: {twitter_uid: env['omniauth.auth']['uid']})
end …Run Code Online (Sandbox Code Playgroud) 如何为Mongoid类编写Factory Girl定义,其中一个属性是哈希?(它不是嵌入式文档)
Mongoid类看起来像
class Foo
field :bar, :type => Hash
end
Run Code Online (Sandbox Code Playgroud)
所以一个实例Foo应该能够通过访问barfoo.bar['foobar'] = 1
这不能在Factory Girl定义中描述,但通过执行以下操作:
Factory.define :foo do |f|
f.bar {:foobar => 1}
end
Run Code Online (Sandbox Code Playgroud) 我不确定我的设置有什么问题......我无法创建一个mongoid记录(使用mongoid 3.0.0):
bundle exec rails console
ruby-1.9.2-p290 :045 > u = NoUser.new
=> #<NoUser _id: 4ffc2e8487bc11b128000005, _type: nil, username: nil>
ruby-1.9.2-p290 :046 > u.username = 'aaa1'
=> "aaa1"
ruby-1.9.2-p290 :047 > u
=> #<NoUser _id: 4ffc2e8487bc11b128000005, _type: nil, username: "aaa1">
ruby-1.9.2-p290 :048 > u.save
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
gems/moped-1.1.1/lib/moped/node.rb:74:in `block in command'
gems/moped-1.1.1/lib/moped/node.rb:522:in `[]'
gems/moped-1.1.1/lib/moped/node.rb:522:in `block (3 levels) in …Run Code Online (Sandbox Code Playgroud) 我正在尝试遵循Mongoid 3中的建议- 检查复合键的唯一性,以便在2个字段上具有唯一约束的模型.
id声明是这样的:
field :_id, type: String, default: &method(:generate_id)
private
def generate_id
user.id.to_s + offering.id.to_s
end
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,当我通过new实例化一个对象时它会有一个conniption因为它试图在它有用户和提供之前生成id而且它(正确地)不想使用id的id.我可以传入用户并提供构造函数参数,一切都很好.
我的问题是,这是正确的做法吗?考虑到为了得到一个独特的约束,我必须做的所有钝的古怪感觉都很脏.代码根本没有透露意图.有没有更好的办法?
我正在使用ActiveAdmin(https://github.com/gregbell/active_admin)进行Rails,并且我正在尝试加载用户模型的索引视图.这是我的app/admin/users.rb文件中的代码:
ActiveAdmin.register User do
config.per_page = 10
index :pagination_total => false do
end
end
Run Code Online (Sandbox Code Playgroud)
我启用了分页,但看起来它仍在尝试加载所有用户,导致超时.如何让它一次只加载少数(例如10个)用户?
我必须将我的Rails应用程序连接到MongoDB,经过一些研究我发现了一个gem(mongoid).我的疑问是,如何创建模型?MongoDB上的集合看起来像下面的示例:
{
"_id": {
"$oid": "56fbf7e577550f39a5aea04a"
},
"id_test": "225|1",
"array_ex1": [],
"array_ex2": [
"obj_ex1": {
"field_obj_1": "text1",
"field_obj_2": "text2",
"field_obj_3": "text3",
}
],
"obj_ex2": {
"field1: "textex1",
"field2: "textex2",
"field3: "textex3",
},
"flg_test": true
}
Run Code Online (Sandbox Code Playgroud)