Rails 4 : 查找或创建方法

Rails 4 : find or create method

我在 experiencecompany 之间有一个关联,其中公司 has_many :experiences 和经验 belongs_to :company,现在我想设计这个:如果用户输入公司名称公司模型中已经存在的,它将分配给它,但如果用户输入公司模型中不存在的公司名称 - 公司必须保留但不能创建为新记录(我不想使用find_or_create 方法和 find_by 似乎不适用于这种情况)

编辑

这是我的公司控制人

def allcompanies
    @companies = Company.paginate(page: params[:page], per_page: 10).order("created_at DESC")
  end



  def show
    @company = Company.find_by_slug(params[:id])

    if @company
      render action: :show
    else
      render file: 'public/404', status: 404, formats: [:html]
    end

  end

  def index
    @companies = Company.limit(19).order("id DESC")
  end


  def new
    @company = Company.new
  end


  def edit
  end

  def create
    @company = Company.new(company_params)

    respond_to do |format|
      if @company.save
        flash[:notice] = "Entreprise '#{@company.name}' Crée!"
        format.html { redirect_to @company}
      else
        format.html { render action: 'new' }
      end
    end
  end

  def update
    respond_to do |format|
      if @company.update(company_params)
        flash[:notice] = "Entreprise '#{@company.name}' à été mis à jour"
        format.html { redirect_to @company }
      else
        format.html { render action: 'edit' }
      end
    end
  end

  def destroy
    @company.destroy
    respond_to do |format|
      format.html { redirect_to companies_url }
    end
  end



  private


    def set_company
      @company = Company.find_by_slug(params[:id])
    end


    def company_params
      params.require(:company).permit(:name, :company_description, :country, :city, :company_status, :company_size, :company_website, :sector_ids, :job_id, :companylogo)
    end

这是我的经验模型,实际上为每个公司创造了新记录

    belongs_to :profile
    belongs_to :company

    validates :company_name, presence: true


  def company_name
    company.try(:name)
  end

  def company_name=(name)
     self.company = Company.find_or_initialize_by(name: name)
  end

好的,所以您希望一些 companies 可见而一些不可见。

然后,您可以创建一个相应的boolean字段,例如public_visible并将其设置为false,因为companies您不知道(即由应用程序创建用户)。

在你的控制器中做这样的事情:

@company = Company.find_by_name(params[:company][:name])
if @company.blank?
  @company = Company.create(params[:company].merge({ public_visible: false }))
end
@company.experiences.create(...)

只是举个例子,不知道你们在创建公司方面的真实情况,需要根据自己的需要进行调整。