0

Я пытаюсь сделать некоторые передовые отношения в своих моделях RoR.Отношения в Ruby on Rails через 4 модели

Да, у меня есть проекты и задачи. Проекты имеют задачи, а у пользователей есть проекты.

Теперь я хочу, чтобы пользователь, который «подписался» на проект, теперь может «зарегистрироваться» к задачам внутри этого проекта.

Мои текущие классы вкратце:

class AdminUser < ActiveRecord::Base 
has_and_belongs_to_many :projects 
has_and_belongs_to_many :tasks 
has_many :admin_users_projects 

[...] 


class AdminUsersProject < ActiveRecord::Base 

    belongs_to :admin_user 
    has_and_belongs_to_many :project 
    has_many :tasks 

[...] 

class Project < ActiveRecord::Base 

    has_many :tasks 
    has_and_belongs_to_many :admin_users 
    has_and_belongs_to_many :admin_users_projects 

[...] 

class Task < ActiveRecord::Base 

    belongs_to :project 
    has_and_belongs_to_many :admin_users 
    belongs_to :admin_users_project 

[...] 

Зонирование выглядит следующим образом:

create_table "admin_users", :force => true do |t| 
    t.string "first_name",  :limit => 25 
    t.string "last_name",  :limit => 50 
    t.string "email",   :limit => 100, :default => "", :null => false 
    t.string "hashed_password", :limit => 40 
    t.datetime "created_at",          :null => false 
    t.datetime "updated_at",          :null => false 
    t.string "username",  :limit => 25 
    t.string "salt",   :limit => 40 
    end 

    add_index "admin_users", ["username"], :name => "index_admin_users_on_username" 

    create_table "admin_users_projects", :force => true do |t| 
    t.integer "admin_user_id" 
    t.integer "project_id" 
    end 

    add_index "admin_users_projects", ["admin_user_id", "project_id"], :name =>  "index_admin_users_projects_on_admin_user_id_and_project_id" 

    create_table "projects", :force => true do |t| 
    t.string "name" 
    t.integer "position" 
    t.boolean "visible", :default => false 
    t.datetime "created_at",     :null => false 
    t.datetime "updated_at",     :null => false 
    end 

    create_table "tasks", :force => true do |t| 
    t.integer "project_id" 
    t.string "permalink" 
    t.integer "position" 
    t.boolean "visible" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.string "name" 
    t.integer "admin_user_id" 
    t.integer "progress" 
    end 

    add_index "tasks", ["permalink"], :name => "index_tasks_on_permalink" 
    add_index "tasks", ["project_id"], :name => "index_tasks_on_project_id" 

end 

У меня есть мнение, что показывают проекты, а затем просматривать их подмножества задач У меня также есть который показывает проекты пользователей, но теперь я хочу, чтобы он показывал, что пользователи подмножества задач.

Мой взгляд на 'admin_user_projects' вкратце заключается в следующем:

<% @admin_users_projects.each do |admin_users_projects| %> 
    <tr> 
     <td><%= admin_users_projects.admin_user_id %></td> 
     <td><%= admin_users_projects.admin_user.username %></td> 
     <td><%= admin_users_projects.project_id %></td> 
     <td><%= admin_users_projects.project.name %></td> 
    </tr> 
    <% end %> 

Это показывает имя пользователей ID, имя пользователя, идентификатор проекта и проекта. Теперь я хочу добавить строку, показывающую, сколько задач пользователь «зарегистрировал» для этого проекта. Я попытался

 <td><%= admin_users_projects.tasks.size %></td> 

Но получить следующее:

Mysql2::Error: Unknown column 'tasks.admin_users_project_id' in 'where clause': SELECT COUNT(*) FROM `tasks` WHERE `tasks`.`admin_users_project_id` = 1 

Кто-нибудь есть какие-либо идеи, как получить эти отношения работают эффективно?

ответ

0

Вы не имеют отношения

class AdminUsersProject < ActiveRecord::Base 
    has_many :tasks 

если таблица задач не имеет внешнего ключа с именем admin_users_project_id.

Я подозреваю, что у вас не так много задач для записи ссылок AdminUsersProjects.

Вместо этого я думаю, что вам нужны задачи администратора или задачи проекта.

Пока вы не уточните, что хотите, никто не сможет вам помочь. После того, как вы четко поймете, что хотите, вы сможете сами выяснить ответ.

+0

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

+0

Да, но когда вы просите о задачах админ-пользовательских проектов, какие задачи вы просите? Разъяснение, которое поможет вам написать ваш запрос. –

+0

Иными словами, для задач проектов получить объект проекта, и они будут project.tasks. Для пользователей, получить объект пользователя, и их задачи будут user.tasks. Достаточно просто, если это не совсем то, что вы хотите, и в этом случае вам нужно переопределить то, что вы хотите. –

1

Мое предложение заключается в следующем:

class AdminUser < ActiveRecord::Base 
    has_and_belongs_to_many :projects 
    has_many :assigned_tasks 
    has_many :tasks, through: :assigned_tasks 
end 

class AssignedTask < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :task 

    validate :user_assigned_to_project 

    private 

    def user_assigned_to_project 
    unless user.projects.include? task.project 
     errors.add(:project, "is not valid") 
    end 
    end 
end 

class Project < ActiveRecord::Base 
    has_and_belongs_to_many :admin_users 
    has_many :tasks 
end 

class Task < ActiveRecord::Base 
    has_many :assigned_tasks 
    has_many :users, through: :assigned_tasks 
    belongs_to :project 
end 


class GiantMigration < ActiveRecord::Migration 
    create_table :admin_users do |t| 
    # whatever 
    end 
    create_table :projects do |t| 
    # whatever 
    end 
    create_table :assigned_tasks do |t| 
    t.integer :admin_user_id, null: false 
    t.integer :task_id, null: false 
    end 
    create_table :tasks do |t| 
    # whatever 
    t.integer :project_id 
    end 
    create_table :admin_users_projects, id: false do |t| 
    t.integer :admin_user_id, null: false 
    t.integer :project_id, null: false 
    end 
end 

Некоторые общие замечания:

  • Вы должны выбрать, если вы собираетесь использовать чистый таблицу соединения (HABTM) или присоединиться к модели (has_many :through) , Прямо сейчас вы смешиваете эти два.
  • Не используйте force: true в своих миграциях по умолчанию.
  • Придерживайтесь конвенций Rails': has_and_belongs_to_many :projects (который вы использовали проект, в единственном числе)
Смежные вопросы