- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
今天早上我醒来时遇到了一个奇怪的问题,mongoid 正在为模型中未定义的属性创建记录
为了克服这个问题,我决定实现 attr_accessible 也在 Mongoid 中提到 specification
"Providing a list of fields as accessible is simply the inverse of protecting them. Anything not defined as accessible will cause the error." -- Mongoid Specification
认为一切都会正常工作我创建了一个虚拟记录而且我也很惊讶我被插入以反对上面的声明
"Anything not defined as accessible will cause the error
这是我的模型结构
class PartPriceRecord
include Mongoid::Document
field :supplier_id,type: Integer
field :part_number,type: String
field :part_description, type: String
field :core_indicator,type: String
field :us_part_price,type: Float
field :us_core_price,type: Float
field :us_fleet_price,type: Float
field :us_distributor_price,type: Float
field :ca_part_price,type: Float
field :ca_distributor_price,type: Float
field :ca_core_price,type: Float
field :ca_fleet_price,type: Float
field :basic_file_id,type: Integer
index :part_number, unique: true
validates_presence_of :supplier_id
validates_presence_of :part_number
#validates_uniqueness_of :part_number
validates :part_number ,:format => { :with => /^[a-z0-9A-Z\s*-]+[-a-z0-9\s-]*[a-z0-9\s*-]+$/i ,:message => "Only AlphaNumeric Allowed" }
validates :supplier_id, :format => { :with => /^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i , :message => "Only Alphanumeric Allowed" }
#validates :part_description,:presence => true
validates :part_description,:format => { :with => /^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i ,:message => "Only Alphanumberic Allowed"} ,:allow_nil => true
validates :core_indicator ,:inclusion => { :in => %w(Y N),
:message => "%{value} is not a valid Coreindicator must be Y | N"
} ,:allow_nil => true,:allow_blank => true
validates :us_part_price,:us_core_price,:us_fleet_price,:us_distributor_price,:ca_part_price,:ca_core_price,:ca_fleet_price,:ca_distributor_price ,:format => { :with => /^([0-9]+(\.([0-9]{2}|[0-9]{1}))?)$/ ,:message => "should look like money" } ,:allow_nil => true,:allow_blank => true
@@required_attributes =[:supplier_id,:part_number,:part_description,:core_indicator,:us_part_price,:us_core_price,:us_fleet_price,:us_distributor_price,:ca_part_price,:ca_core_price,:ca_fleet_price,:ca_distributor_price]
@@not_required_attributes = ["_id","basic_file_id"]
cattr_reader :required_attributes,:not_required_attributes
attr_accessible :supplier_id,:part_number,:part_description, :core_indicator,:us_part_price,:us_core_price,:us_fleet_price,:us_distributor_price,:ca_part_price,:ca_distributor_price,:ca_core_price,:ca_fleet_price,:basic_file_id
end
这是我从控制台创建的记录
ruby-1.9.2-head :003 > PartPriceRecord.count()
=> 260317 ## initial count before creating a new record
ruby-1.9.2-head :004 > p1 = PartPriceRecord.new(:customer_id => "One",:part_number => "ASA",:supplier_id => "Supp")
=> #<PartPriceRecord _id: 4fa77921d2d8d60e39000002, _type: nil, supplier_id: "Supp", part_number: "ASA", part_description: nil, core_indicator: nil, us_part_price: nil, us_core_price: nil, us_fleet_price: nil, us_distributor_price: nil, ca_part_price: nil, ca_distributor_price: nil, ca_core_price: nil, ca_fleet_price: nil, basic_file_id: nil>
ruby-1.9.2-head :005 > p1.save
=> true ## Record got created
ruby-1.9.2-head :006 > PartPriceRecord.count()
=> 260318 ## Count indicating record was created
知道为什么会这样吗?
谢谢
最佳答案
您的问题是有效的——从以下测试和对 Mogoid 代码的粗略阅读来看,文档似乎不一致、不完全正确并且有些过时。
受 attr_protected 或 NOT attr_accessible 的字段忽略批量分配;他们不会在质量分配上引发错误。
在 Protected 部分,“引发错误”是不正确的,文档甚至不匹配 User 和 Person。在 Accessible 部分,“will cause the error”是不正确的,但是注释“默默地忽略 protected ”给出了一个线索,即没有引发错误并且忽略了质量分配。
这是来自 mongoid/spec/mongoid/attributes_spec.rb 的片段,它支持这一点。
describe ".attr_accessible" do
context "when the field is not _id" do
let(:account) do
Account.new(number: 999999)
end
it "prevents setting via mass assignment" do
account.number.should be_nil
end
end
...
end
您必须将字段 customer_id 添加到您的 PartPriceRecord 模型。我对 User 和 PartPriceRecord 的测试如下。希望这会有所帮助。
require 'test_helper'
class PartPriceRecordTest < ActiveSupport::TestCase
def setup
User.delete_all
PartPriceRecord.delete_all
end
test "User" do
assert_equal(0, User.count())
# Set attributes on a user properly.
user = User.new(first_name: "Corbin")
assert_equal("Corbin", user.first_name)
user.attributes = { first_name: "Corbin" }
assert_equal("Corbin", user.first_name)
user.write_attributes(first_name: "Corbin")
assert_equal("Corbin", user.first_name)
# Attempt to set attributes a user, raising an error. # <-- This documentation is incorrect, no error is raised
#user = User.new(first_name: "Corbin", password: "password")
user.attributes = { first_name: "Corbin", password: "password" } # inaccessible field is forced to nil
assert_equal("Corbin", user.first_name)
assert_equal(nil, user.password)
user.write_attributes(first_name: "Corbin", password: "password") # inaccessible field is forced to nil
assert_equal("Corbin", user.first_name)
assert_equal(nil, user.password)
end
test "PartPriceRecord" do
assert_equal(0, PartPriceRecord.count())
p1 = PartPriceRecord.new(:customer_id => "One",:part_number => "ASA",:supplier_id => "Supp")
assert_equal(nil, p1.customer_id)
p1.save
assert_equal(1, PartPriceRecord.count())
assert_equal(nil, PartPriceRecord.find(p1.id).customer_id)
end
end
关于mongodb - Mongoid attr_accessible 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10478303/
我不得不跟踪脏东西。它适用于 parent 博士。但是当我更改嵌入或引用的文档时,脏 必须通过文档本身的嵌入/引用来访问。 如何跟踪父文档本身的脏? 最佳答案 我已经整理了 mongoid 扩展来解决
给定一个带有如下扩展的简单嵌入关系: class D include Mongoid::Document embeds_many :es do def m #...
因此,似乎没有任何干净的方法可以通用地允许具有强参数的 Hash 字段。这当然可能是一个强大的参数问题,但我很好奇是否有解决方法。我有一个包含一些字段的模型... field :name, type:
当我尝试查询 Mongoid 条件的结果并仅保留字段不同的文档时,我感到非常沮丧。这样做: Books.all.distinct(:name) ..只返回名称字段,而不是文档。 还使用 uniq此处另
Mongoid 提供了一些 rake 任务,其中之一为数据库中的所有集合创建索引: 耙数据库:创建索引 但是如果我错了请纠正我,创建索引与实际索引所有项目不是不同吗?我怎样才能重新索引我的文档?如果我
我有一个订阅者类,它有 embeds_many 订阅。订阅具有属性状态。我想添加对状态的验证,以便每个订阅者只有一个订阅可以具有“事件”状态。订户可以拥有多个状态为“已购买”或“已过期”的订阅。 最佳
Mongoid 提供方法 create 和 create!比如 Artist.create(name: "Pablo Picasso") 或 Artist.create!(name: "Pablo P
在 Mongoid 2.x 中,可以执行 Mongoid.database.connection.close 来重置数据库连接。这个特定的 API 在 Mongoid3 中不再可用,重置连接的新方法是
我有一个名为“艺术家”的集合,我想将其重命名为“artist_lookups”。我该怎么做? 最佳答案 使用 mongoid5/mongo ruby 驱动程序 2: # if you need t
目前我为我的类(class)设置了 default_scope,但我希望 rails_admin 使用 .unscoped 执行列表查询 有什么办法可以做到这一点吗?我没有看到覆盖 rails_adm
我知道可以通过数据库调用找到它,但出于好奇,例如在 Node 中,如果我有一个 Mongoose 文档 ID 数组。我如何针对该数组模拟 indexOf 函数以确定其中是否有另一个 mongoId?
Mongoid 没有超时选项。 http://mongoid.org/en/mongoid/docs/installation.html 我希望 Mongoid 终止长时间查询。如何设置 Mongoi
我似乎无法在这里或通过Google找到答案,任何帮助都很棒。 建筑物可以正确保存,但是嵌入式文档PriorityArea不会更新... 我想最终让它均匀地为新的优先级区域添加一个新表格,但是需要首先对
根据 github 上 mongoid 的自述文件,我可以做一些奇特的查询,比如Person.select(:first_name, :last_name).where(:title => "Sir"
有谁知道如何索引和搜索embedded documents与 sunpot_mongoid ? 问题已在 sunspot_mongoid issues 中提出,但至今无解。 最佳答案 刚试过。这是一个
我有一个来自 Devise 的模型用户具有这种关系: 用户名 # Relationships references_many :houses, :dependent => :delete 现在我有一
我在控制台上执行此查询,但是我不能简单地复制并粘贴它以在 mongo shell 中执行它。 有什么方法可以将mongoid DSL转换成真正的mongo查询语句。 谢谢 database=test
在文档中它说你可以使用 inverse_of: nil 但并没有真正描述用例: http://mongoid.org/en/mongoid/docs/relations.html#has_and_be
我正在将 mongoid-history gem 添加到我的项目中。 根据指南in github ,当我将 Userstamp 添加到我的跟踪器时,它会创建 created_by 字段,并使用名为 c
Mongoid.master.collection("seq").find_and_modify({ :query => {:_id => self.class.name}, :up
我是一名优秀的程序员,十分优秀!