为什么这个create方法会生成nil
记录?
我试过了:
Dropdown.create(主题:“测试”)
Dropdown.create({subject:“test”,subject_value:“1”})
Dropdown.create({:subject =>“test”,:subject_value =>“1”})
所有结果都会产生nil
条记录。
(0.1ms) begin transaction
SQL (0.6ms) INSERT INTO "dropdowns" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2016-01-21 23:58:04.979225"], ["updated_at", "2016-01-21 23:58:04.979225"]]
(2.1ms) commit transaction
=> #<Dropdown id: 145, subject: nil, visible: nil, subject_value: nil, subject_description: nil, created_at: "2016-01-21 23:58:04", updated_at: "2016-01-21 23:58:04
模型文件
class Dropdown < ActiveRecord::Base
FIELDS = [
:subject,
:visible,
:subject_value,
:subject_description
]
attr_accessor(*FIELDS)
subjects = %w[math english spanish]
subjects.each do |s|
scope s.to_sym, -> { where(subject: s) }
end
end
迁移文件
class CreateDropdowns < ActiveRecord::Migration
def change
create_table :dropdowns do |t|
t.string :subject
t.boolean :visible
t.string :subject_value
t.string :subject_description
t.timestamps null: false
end
end
end
答案 0 :(得分:2)
您通过声明ActiveRecord::Base
来覆盖attr_accessor
功能:
#app/models/dropdown.rb
class Dropdown < ActiveRecord::Base
subjects = %w(math english spanish)
subjects.each do |s|
scope s.to_sym, -> { where(subject: s) }
end
end
您不需要申报FIELDS - 您可以致电@model.attributes
(instance) or Model.column_names
(class)获取该模型的所有字段。
attr_accessor
在课堂上创建了一组getter
/setter
methods。这将覆盖您从数据库中获得的任何属性,这就是您在保存时获取nil
条目的原因。 Good ref here
-
上述模型应该适合您。
答案 1 :(得分:-1)
如果这些字段是数据库中表的列,则无需使用attr_accessor
。 ActiveRecord为您完成了它。
尝试使用attr_accessible
代替attr_accessor
。但对于4+导轨,没有必要使用它。见http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_accessible
此方法已弃用或在最新的稳定版本上移动。该 此处显示了最新的现有版本(v3.2.13)。