Правильные ассоциации Ruby on Rails - PullRequest
7 голосов
/ 08 июля 2011

Может ли кто-нибудь помочь мне исправить мои ассоциации?

У меня есть следующие модели:

User, Developer, Application, Comments, Rating, Permission

Требования:

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. 

Я уже создал некоторые ассоциации, но я считаю, что это не на 100% правильно и не существует более простого способа сделать это.

Может кто-нибудь предложить мне правильный способ сделать это?

Ответы [ 3 ]

14 голосов
/ 08 июля 2011

Вы путаете модели с авторизацией.

Вам следует проверить CanCan для авторизации на основе ролей. Например, вам не нужна ваша модель разработчика, поскольку это просто пользователь с другой ролью / разрешениями.

Редактировать: изменена «аутентификация на основе ролей» на «авторизация на основе ролей». В комментарии ниже указывается разница между аутентификацией и авторизацией.

7 голосов
/ 08 июля 2011

Я думаю, это то, что вы хотите, насколько ваша модель работает. Вы можете использовать модель соединения для управления разрешениями вашего приложения и использовать Rails STI для управления тем, что может делать каждый тип пользователя, независимо от того, разрабатывается он или нет.

user.rb

class User < ActiveRecord::Base
  has_many :apps
  has_many :comments, :through => :user_comments
  has_many :ratings, :through => :user_ratings
end

comment.rb

class Comment < ActiveRecord::Base
  belongs_to :user
end

rating.rb

class Rating < ActiveRecord::Base
  belongs_to :user
end

user_comment.rb

class UserComment < ActiveRecord::Base
  belongs_to :app
end

user_rating.rb

class UserRating < ActiveRecord::Base
  belongs_to :app
end

normal_user.rb (STI)

class NormalUser < User
end

developer.rb (STI)

class Developer < User
end

app.rb

class App < ActiveRecord::Base
  has_many :permissions, :through => :app_permissions
  has_many :user_comments
  has_many :user_ratings
end

permission.rb

class Permission < ActiveRecord::Base
  belongs_to :app
end

app_permission.rb

class AppPermission < ActiveRecord::Base
end
3 голосов
/ 15 июля 2011

Я согласен с @Mark, не используйте STI. Лучший способ будет реализован в соответствии с предложением @Chris Barretto, за исключением STI, и использовать CanCan для аутентификации на основе ролей. Изменение для модели пользователя будет:

class User < ActiveRecord::Base
    has_many :apps
    has_many :comments, :through => :user_comments
    has_many :ratings, :through => :user_ratings
    has_many :roles
end

И будет еще одна модель для роли:

class Role  < ActiveRecord::Base
    has_many :users
end

Если вы используете для аутентификации гемы типа Devise , это будет намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...