Rails: create on has_one association

后端 未结 4 1151
鱼传尺愫
鱼传尺愫 2020-12-22 23:05

Hi (huge Rails newbie here), I have the following models:

class Shop < ActiveRecord::Base
  belongs_to :user
  validates_uniqueness_of :title, :user_id, :         


        
相关标签:
4条回答
  • 2020-12-22 23:49

    A more concise way to do this is with:

    @user.create_shop(params[:shop])
    

    See methods added by has_one in the Ruby on Rails guides.

    0 讨论(0)
  • 2020-12-22 23:51

    Two more ways if you want save instead of create:

    shop = @user.build_shop
    shop.save
    
    shop = Show.new
    shop.user = @user
    shop.save
    
    0 讨论(0)
  • 2020-12-22 23:53

    Just to add to above answers -

    @user.create_shop(params[:shop])
    

    Above syntax creates new record but it subsequently deletes similar existing record.

    Alternatively, if you do not want to trigger delete callback

    Shop.create(user_id: user.id, title: 'Some unique title')
    

    This thread might be helpful. Click here

    0 讨论(0)
  • 2020-12-23 00:07

    First of all, here is how to do what you want:

    @user = current_user
    @shop = Shop.create(params[:shop])
    @user.shop = @shop
    

    Now here's why your version did not work:

    You probably thought that this might work because if User had a has_many relation to Shop, @user.shops.create(params[:shop]) would work. However there is a big difference between has_many relations and has_one relations:

    With a has_many relation, shops returns an ActiveRecord collection object, which has methods that you can use to add and remove shops to/from a user. One of those methods is create, which creates a new shop and adds it to the user.

    With a has_one relation, you don't get back such a collection object, but simply the Shop object that belongs to the user - or nil if the user doesn't have a shop yet. Since neither Shop objects nor nil have a create method, you can't use create this way with has_one relations.

    0 讨论(0)
提交回复
热议问题