学生为ruby on rails的未知属性'name'

时间:2016-04-20 17:23:28

标签: ruby-on-rails ruby csv

我有两个名为Student和Parent的模型类。我正在尝试上传一个CSV文件,允许我使用Parent属性:名称,电子邮件等到Student模型类或其CSV文件中。当我运行我的代码时,我得到了Student的错误消息unknown attribute'name'。我理解为什么我收到此错误消息,因为属性名称不在Student属性中,而只在Parent类中。我需要有关如何正确地将父属性添加到我的Student模型类的指导。我可以在同一个CSV文件中使用学生属性导出Parent属性,但是当我导入这些CSV文件时,我得到了我提前提到的错误消息。任何帮助,将不胜感激。

Student.rb模型类:

class Student < ActiveRecord::Base
  belongs_to :parent

  delegate :email,:name,:phone_number,to: :parent, allow_nil: true


  def self.to_csv
    attributes = %w{parent_id name first_name last_name  age workshop interest registration_date email   }
    CSV.generate(headers: true) do |csv|
      csv << attributes

      all.each do |script|
        csv << attributes.map{ |attr| script.send(attr) }
      end
    end

  end

  def self.import(file)
    spreadsheet = open_spreadsheet(file)
    header=spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header,spreadsheet.row(i)].transpose]
    #CSV.foreach(file.path, headers: true) do |row|

      student = find_by_id(row["id"])|| new
      student.attributes = row.to_hash.slice(*row.to_hash.keys)
      student.save!
    end
  end


  def self.open_spreadsheet(file)
    case File.extname(file.original_filename)
    when ".csv" then Roo::CSV.new(file.path)
    when ".xls" then Roo::CSV.new(file.path)
    when ".xlsx" then Roo::CSV.new(file.path)
    else raise "Unknown file type: #{file.original_filename}"
    end
  end
end

1 个答案:

答案 0 :(得分:1)

您从name

中提取的属性列表中有Student
def self.to_csv
   attributes = %w{parent_id name # <--

运行以下代码时,name是以attr

发送的列之一
all.each do |script|
  csv << attributes.map{ |attr| script.send(attr) }
end

scriptStudent的一个all实例。script

问题是您在该块中使用了student作为变量名称,它应该是self.to_csv,这让您感到困惑。

要解决此问题,请在Student课程中更改attributes,以便列出的Student只是attributes = column_names的{​​{1}}。如果您只对数据库列值感兴趣,可以使用ActiveRecord,以便<html> <head> <meta charset="utf-8"> <title>Stack POC</title> <script type="application/javascript" src="app/scripts/controllers/user_controller.js"></script> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> </head> <body ng-app="userListApp"> <div ng-controller="userListController"> <h1>No of users {{userCounts}}</h1> </div> </body> </html> 能够以方便的数组为您提供这些值。