如果rails中的联合表中的值不同,则仅创建新记录

时间:2018-01-19 00:49:37

标签: ruby-on-rails

就像把学生加入课堂一样

每次我通过CSV文件上传学生时,他们都与当前教室相关联,同一学生可以上传到另一个教室

has_many :classroom_students
has_many :students, through: :classroom_students

has_many :classroom_students
has_many :classrooms, through: :classroom_students

我正在尝试通过CSV文件更新学生和教室模型,其中CSV文件将包含学生的ID。我对联合表更感兴趣,因为我正在处理具有唯一性的学生/教室名称:true

我有学生和教室模型和联合课堂教室_学生

如果值不同,如何在我的联合表中创建新记录,如果已经存在则显示通知?

下面是我目前用于创建新记录的代码

 student = Student.last
 classroom = Classroom.last

 student.classrooms << classroom

以下完整代码

def self.import(file, user_id)
        spreadsheet = Roo::Spreadsheet.open(file.path)
        header = spreadsheet.row(1)
        (2..spreadsheet.last_row).each do |i|
          row = Hash[[header, spreadsheet.row(i)].transpose]
          student = find_by(id: row["id"]) || new
          student.attributes = row.to_hash.merge(user_id: user_id)
          student.save!

                #for creating an associating for the new students added
                student = Student.last
                classroom = Classroom.last
                student.classrooms << classroom     
        end
      end 
    end # end class

1 个答案:

答案 0 :(得分:0)

您可以在ClassroomStudent模型上使用唯一性验证 - 要求student_id是唯一的,但要将其范围限定为classroom_id,这实际上意味着您需要student_idclassroom_id的组合是唯一的,我认为这是您正在寻找的。这意味着更多的学生可以加入同一个教室,同一个学生可以加入更多的教室,但同一个学生不能再次加入同一个教室。在ClassroomStudent

validates :student_id, uniqueness: { scope: :classroom_id, message: "can only belong to this classroom once" }

希望有所帮助!