铁路应用中的一对一

时间:2015-12-06 13:16:26

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

我对在rails中进行一对一关联的正确方法有疑问。 我使用Devise GEM作为用户模块,所有用户只能拥有一家公司,所以我做了

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_one :company
end

class Company < ActiveRecord::Base
  belongs_to :user
end

创建公司的正确方法是什么?通常我这样做: 如果存在显示消息,如果不继续创建,我检查公司是否存在。那是好方法吗?

 def new
   if Company.exists?(:user_id => current_user.id )
     flash[:notice] = "Only One company is allowed."
     redirect_to(:action => 'index')
   end
 end

 def create   
   # Instantiate a new object using form parameters
   @company = Company.new(company_params)
   #@company = Company.new(params[:page].merge(:user_id => 1))
   # Save the object
   if @company.save
     # If save succeeds, redirect to the index action
     flash[:notice] = "Company created successfully."
     redirect_to(:action => 'index')
   else
     # If save fails, redisplay the form so user can fix problems
     render('new')
   end    
 end

1 个答案:

答案 0 :(得分:0)

如果您的表单已正确创建,则应该没问题。

在您的用户表单中,您应该使用fields_for,它应该如下所示: <%= f.fields_for :company do |company_field| %> <%= company_field.text_field :name %> <% end %>

修改:不要忘记在模型用户上添加nested attibutesaccepts_nested_attributes_for :address,位于has_one:company下方。

  

嵌套属性允许您保存关联记录的属性   通过父母。

除此之外,请注意您希望在new方法中进行的验证,处理验证的正确方法是使用ActiveRecord Validations