正确的关联Ruby on Rails

gla*_*kou 7 ruby activerecord ruby-on-rails

有人可以帮我纠正我的联想吗?

我有以下型号:

User, Developer, Application, Comments, Rating, Permission
Run Code Online (Sandbox Code Playgroud)

要求:

A user can be a Developer or not.
A user can have Default Permissions and Permissions for each application
A user can install multiple Applications
A user can comment and rate multiple Applications
A developer can develop multiple applications
An application can request a list of permissions. 
Run Code Online (Sandbox Code Playgroud)

我已经创建了一些关联,但我相信它不是100%正确或更简单的方法存在.

有人可以建议我一个正确的方法吗?

Mse*_*enb 14

您在授权时会混淆模型.

您应该查看CanCan以获得基于角色的授权.例如,您不需要开发人员模型,因为它只是具有不同角色/权限的用户.

编辑:将"基于角色的身份验证"更改为"基于角色的授权".正如下面的评论指出了身份验证和授权之间的区别.


Chr*_*tto 7

我认为这就是你想要的模型工作.您可以使用连接模型来管理应用程序权限,并使用Rails STI来管理每种类型的用户可以执行的操作,无论是否正在开发.

user.rb

class User < ActiveRecord::Base
  has_many :apps
  has_many :comments, :through => :user_comments
  has_many :ratings, :through => :user_ratings
end
Run Code Online (Sandbox Code Playgroud)

comment.rb

class Comment < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

rating.rb

class Rating < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

user_comment.rb

class UserComment < ActiveRecord::Base
  belongs_to :app
end
Run Code Online (Sandbox Code Playgroud)

user_rating.rb

class UserRating < ActiveRecord::Base
  belongs_to :app
end
Run Code Online (Sandbox Code Playgroud)

normal_user.rb(STI)

class NormalUser < User
end
Run Code Online (Sandbox Code Playgroud)

developer.rb(STI)

class Developer < User
end
Run Code Online (Sandbox Code Playgroud)

app.rb

class App < ActiveRecord::Base
  has_many :permissions, :through => :app_permissions
  has_many :user_comments
  has_many :user_ratings
end
Run Code Online (Sandbox Code Playgroud)

permission.rb

class Permission < ActiveRecord::Base
  belongs_to :app
end
Run Code Online (Sandbox Code Playgroud)

app_permission.rb

class AppPermission < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)