【问题标题】:how to make objects from associated models in rails?如何从rails中的关联模型制作对象?
【发布时间】:2016-03-22 07:10:20
【问题描述】:

我有常驻模型

class Resident < ActiveRecord::Base
        has_one :user
end

和用户模型

class User < ActiveRecord::Base
   belongs_to :resident
 end

我想从 Residents 的 roll_number 属性创建用户。我有一个表单,它要求用户提供一些值,包括 roll_number 字段,如果卷号与 Residents 表的 roll_number 属性匹配,则创建用户对象。

我们已经在我们的数据库中添加了管理员添加的居民(有roll_numbers的学生名单)和roll_number。如果 roll_number 与现有常驻表的 roll_number 匹配,则创建用户。

User表的属性

id:自动生成

roll_number:字符串

电子邮件:字符串

密码:字符串

resident_id:来自驻留表的引用

驻留表的属性

id:自动生成

roll_number:字符串

名称:字符串

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord


    【解决方案1】:

    你可以这样做

    def create
      resident = Resident.find_by(roll_number: user_params[:roll_number])
      if resident.present?
        @user = resident.create_user(user_params)
        if @user.save
          @user.send_activation_email
          UserMailer.account_activation(@user).deliver_now
          flash[:info] = "Please check your email to activate your account."
          redirect_to root_url
        else
          render 'new'
        end
      else
        flash[:info] = "Please enter a correct roll number."
        redirect_to root_path
      end
    end
    

    您需要检查如何从 params 访问 roll_number 值,我无法弄清楚,因为我不知道您的表单是什么样子。如果roll_number 不匹配,也需要处理。

    希望有帮助!

    【讨论】:

    • 有一个用户注册的注册页面,包含字段:卷号、电子邮件、密码、密码结构。现在,当用户输入详细信息时,它必须检查卷号是否存在于常驻表中..如果存在,则根据常驻..bcz 创建用户,这是一对一的关系。您提供的解决方案是给出错误 bcz 您正在寻找具有居民身份证的居民,但用户在注册时没有提供居民身份证。他在注册时给我们的与常驻模型相关的是roll_number
    • 用户控制器:justpaste.it/shjl 注册页面:justpaste.it/shjn
    • 如果居民中没有卷号怎么办?
    • 卷号是强制性的.. bcz 我们将在学生注册我们的应用程序时识别学生(在宿舍注册的学生).. roll_number 是用户在注册时给出的主要属性..我们还有在宿舍注册的学生列表,由管理员创建为作为常驻表。只有当roll_number 与用户输入的注册页面匹配时,才会创建用户。然后我们在常驻表中拥有用户的所有详细信息.. 我们将使用这些用户的详细信息以供进一步使用!
    【解决方案2】:

    在 user.rb 中

    before_create :match_resident
    
    def match_resident
      resident = Resident.find_by(roll_number: self.roll_number)
      if resident.blank?
        raise "Invalid roll number"
      end
    end
    

    【讨论】:

      【解决方案3】:

      您可以检查和验证居民的卷号并在 UsersController#Create 方法中创建用户,例如:

      def create
          resident = Resident.find_by(params[:user][:roll_number])
          if resident.present?
            @user = resident.create_user(roll_number: resident.roll_number)
            if @user.save
              # Handle a successful save.
              @user.send_activation_email
              UserMailer.account_activation(@user).deliver_now
              flash[:info] = "Please check your email to activate your account."
              redirect_to root_url
            else
              render 'new'
            end
          end
        end
      

      【讨论】:

      • 那么将 resident_id 添加到用户表有什么问题......那么这两个模型是如何相互关联的?
      • 当你执行 resident.user.new 时,它会自动从 resident 对象中添加 resident_id。
      • @Nischaynamdev 我已经根据您提供的 justPaste 链接编辑了我的答案,您可以用我的代码中的方法替换您的 userscontroller#create 方法,它将完美运行。
      • @Nischaynamdev 是的,并根据该代码编辑了答案。
      • 我只能标记一个答案..但是你们两个给出了相同的答案..所以我选择了第一个回答的人..
      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2020-10-03
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多