2016-01-22 101 views
3

为什么创建方法会创建nil记录?Rails创建方法导致无记录

我曾尝试:

Dropdown.create(主题: “测试”)

Dropdown.create({主题: “测试”,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 
+2

你可能不希望'attr_accessor(* FIELDS)'在你的模型中,你正在寻找ActiveRecord的愤怒 – bjhaid

+2

见https://stackoverflow.com/questions/4700785/using-attr-accessor-and- attr-accessible-on-the-same-field#answer-4735726 and https://stackoverflow.com/questions/2793098/usage-of-attr-accessor-in-rails – bjhaid

回答

2

你通过声明attr_accessor重写你的ActiveRecord::Base功能:

#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 
  1. 你并不需要声明FIELDS - 你可以调用@model.attributes (instance) or Model.column_names (class)来获取该模型的所有领域。

  2. attr_accessor在班级中创建一组getter/setter methods。这会覆盖你可能从你的数据库中获得的任何属性,这就是为什么当你保存时你会得到nil条目。 Good ref here

-

以上型号应该为你工作。

-1

这是没有必要使用attr_accessor如果这些字段在数据库表中的列。 ActiveRecord为你做到了。请使用attr_accessible而不是attr_accessor。但对于轨道4+,没有必要使用它。请参阅http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_accessible

此方法已弃用,或移动至最新的稳定版本。此处显示 上一个现有版本(v3.2.13)。

+0

如何使用'attr_accessible'的建议'ruby-on-rails-4'标签的问题会得到满意的结果吗? –

+0

这并没有回答这个问题,从我发布的链接中得到一个答案,但不理解后果 – bjhaid

+0

糟糕,我的错,只是通过ruby-on-rail标签进行过滤 –