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
。
答案 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