簡體   English   中英

滑軌。 捕獲22期種子數據庫

[英]Rails. Catch 22 issue seeding database

我的rails應用程序具有UserInviteCode模型。 InviteCode belongs_to User

要創建新用戶,需要有效的invite_code 但是要創建這樣的代碼,首先需要一個User ,這是因為belong_to關系的緣故。

我的問題是,我該如何播種數據庫?

編輯以添加模型外觀

class InviteCode < ActiveRecord::Base
  belongs_to :user
  validates :user_id, presence: true
  validates :code, presence: true
end

class User < ActiveRecord::Base
  has_many :invite_codes, dependent: :destroy

  attr_accessor :invite_code
  validate :invite_code_valid, :on => :create

  def invite_code_valid
    @invite_code = InviteCode.find_by_code(self.invite_code)
    if @invite_code.nil?
      self.errors.add(:invite_code, "invalid")
    end
  end
end

對,這樣一個用戶可以用邀請代碼邀請其他用戶嗎? 用戶需要邀請碼才能注冊嗎?

從用戶刪除驗證,並擁有一個表單對象

class SignUpsController
  def new
    @sign_up = SignUp.new
  end

  def create
    @sign_up = SignUp.new(sign_up_params)
    if @sign_up.save
      redirect_to @sign_up.user
    else
      render :new
    end

  end
end

模型

class SignUp
  include ActiveModel::Model
  attr_accessor :invite_code_code, :name

  validates :invite_code, presence: true
  validates :name, presence: true

  def invite_code
    InviteCode.find_by(code: invite_code_code)
  end

  def user
    @user ||= User.new(name: name)
  end

  def save
    return unless valid?
    user.save
  end
end

視圖

<%= form_for @sign_up, url: sign_ups_path do |f| %>
  <div class="field">
    <%= f.label :invite_code_code, "Invite Code" %>
    <%= f.text_field :invite_code_code %>
  </div>

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>
<% end %>

現在,因為該驗證的SignUp不是用戶模型,你可以創建一個沒有邀請碼的用戶。 這樣做可能更好,因為您可以刪除舊的邀請碼,並且如果用戶要更新其個人資料,則不會出現沒有邀請碼的錯誤

另一種方法是直接播種而不驗證種子文件中的任何內容

u = User.new(name: "Joe")
u.save(validate: false)

上面的答案是正確的,但是對於其他可能偶然發現並希望播種數據庫的人而言。 seed.rb文件與schema.rb和migration文件夾一起位於db文件夾中。 它的運行就像一個紅寶石程序。 這是一個了解更多信息的好資源: http : //www.xyzpub.com/en/ruby-on-rails/3.2/seed_rb.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM