Rails 4:查找或创建方法

时间:2015-01-17 13:36:49

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

我在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

1 个答案:

答案 0 :(得分:0)

好的,所以你想要一些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(...)

这只是一个例子,因为我不了解公司创建的真实情况,所以你需要根据自己的需要进行调整。