创建

时间:2017-04-05 07:26:40

标签: ruby-on-rails ruby-on-rails-5

Walls通过WallAssignments协会属于用户。

class Wall < ApplicationRecord
    belongs_to :user

    has_many :wall_assignments
    has_many :users, :through => :wall_assignments
end

class User < ApplicationRecord
    has_many :wall_assignments
    has_many :walls, :through => :wall_assignments
end

class WallAssignment < ApplicationRecord
    belongs_to :user
    belongs_to :wall
end

在创建操作中,我将当前用户与新的墙记录相关联。

def create
    @wall = Wall.new
    @wall.wall_assignments.build(user_id: current_user.id)

    if @wall.save
        redirect_to @wall
    else
        redirect_to current_user
    end
end

然而,除了允许许多用户属于墙,我想让一个用户(创建它的用户)拥有墙。

我正在尝试这样的事情:

class Wall < ApplicationRecord
    after_create { owner }

    belongs_to :user

    has_many :wall_assignments
    has_many :users, :through => :wall_assignments

private

    def owner
        self.owner = Wall.users.first
    end
end

最后,我希望能够在我的观看中致电@wall.owner.name@wall.owner.id

1 个答案:

答案 0 :(得分:1)

我想您希望has_many(作为用户)和has_one(作为所有者)使用相同的表User。

在这种情况下,您的Wall模型将是:

class Wall < ApplicationRecord
    belongs_to :owner, class_name: 'User', foreign_key: :owner_id
    has_many :wall_assignments
    has_many :users, :through => :wall_assignments
end

您需要在墙表中添加owner_id列。 因此,当您创建Wall记录时,它将

class Wall < ApplicationRecord
    after_create { add_owner }

    private    
    def add_owner
        self.update_column(:owner_id, self.users.first.id) if self.users.present?
    end
end 

你也可以修改控制器的创建代码(我假设,create方法只会调用一次。)

def create
    @wall = Wall.new(wall_params)
    @wall.owner_id = current_user.id
    @wall.wall_assignments.build(user_id: current_user.id)
    if @wall.save
        redirect_to @wall
    else
        redirect_to current_user
    end
end

有了这个,你不需要在Wall模型中添加after_create回调。 然后,您可以致电@wall.owner.name@wall.owner_id