2016-04-08 3 views
1

У меня есть приложение, позволяющее пользователю заполнить форму (с названием «контрольный список»), а затем составить список задач, которые он должен будет выполнить. Задачи (называемые «советы») связаны с ответами, которые пользователь дал в форме. Например, если у вас вопрос, «вы приготовили обед?» и пользователь отвечает «нет», тогда будет показан совет «пообедать».Рельсы объединения пользователей, форм и задач

Как только совет будет сделан, пользователь может пометить его как выполненный. Советы одинаковы для всех пользователей. Они уже созданы в приложении администратором.

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

Проблема, с которой я сталкиваюсь: когда пользователь отмечает, что совет завершен, он помечается как завершенный для всех пользователей. Этого не должно быть.

Я не уверен, как это исправить. Ассоциации «Has-many» и «Belongs_to» между советами и пользователями не должны работать, так как пользователь не создает советы?

Я новичок в рельсах, поэтому я был бы счастлив, если бы кто-то мог помочь. Обратите внимание, что я использую Devise для управления пользователями.

схемы:

ActiveRecord::Schema.define(version: 20160407143608) do 

    create_table "advices", force: :cascade do |t| 
    t.string "name" 
    t.text  "content" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "category_id" 
    t.boolean "status" 
    t.string "linkname1" 
    t.text  "link1" 
    t.text  "link2" 
    t.string "linkname2" 
    t.text  "link3" 
    t.string "linkname3" 
    t.integer "ref" 
    t.boolean "completed" 
    end 

    create_table "categories", force: :cascade do |t| 
    t.string "name",  null: false 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "checklists", force: :cascade do |t| 
    t.boolean "facebook" 
    t.boolean "twitter" 
    t.boolean "linkedin" 
    t.boolean "viadeo" 
    t.boolean "instagram" 
    t.boolean "community" 
    t.boolean "cms" 
    t.boolean "seo" 
    t.boolean "crowdfunding" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    end 

    add_index "checklists", ["user_id"], name: "index_checklists_on_user_id" 

    create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

end 

Модели:

class Advice < ActiveRecord::Base 
    belongs_to :category 
end 

class Checklist < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    has_many :checklists 
end 

Вид:

<%= advice.name %> | <%= link_to "Completed", complete_advices_path(advice), method: :put %> 

контроллер:

def complete 
    @advice.completed = true 
    @advice.save 
    redirect_to root_path 
    end 

ответ

1

Вам нужна модель присоединения.

$ rails g model UserAdvice user:references advice:references

class UserAdvice 
    belongs_to :user 
    belongs_to :advice 
end 

в user.rb

has_many :user_advices 
has_many :advices, through: :user_advices 

в advice.rb

has_many :user_advices 
has_many :users, through: :user_advices 

Создать запись в модели присоединиться, когда что-то будет галочка, а затем запрос, чтобы убедиться, что задача выполнена для отдельного пользователя.

Таким образом, когда пользователь проверяет от задачи и представляет, вместо того чтобы использовать completed логическое значение, вы на самом деле создать запись, которая имеет advice_id и user_id. Тогда, если эта запись существует для этого совета, она должна быть отключена для этого пользователя. Имеет ли это смысл?

Если вы прятались завершенные задачи от пользователей, закончивших их, к примеру, вы могли бы сказать что-то вроде

<% if UserAdvice.where(user_id: current_user.id, advice_id: advice.id).count > 0 %> 

Это будет работать, и это хорошо на первый, но делать это таким образом может замедлить вниз по вашему приложению.Если есть много советов, то, что вы, вероятно, захотите сделать, это запустить запрос один раз и получить все записи user_advice и выщипывать идентификаторы. Затем проверьте этот массив идентификаторов против отдельной записи.

В контроллере

# this will return an array of advice_ids 
@user_advices = UserAdvice.where(user_id: current_user).pluck(:advice_id) 

Тогда, как вы итерация советов по вашему мнению:

<% unless @user_advices.include?(advice.id) %> 
    show the advice 
<% end %> 

EDIT:

Чтобы создать запись в этих полных действиях:

def complete 
    UserAdvice.create(user_id: current_user.id, advice_id: @advice.id) 
    redirect_to root_path 
end 
+0

Благодарим вас dmetheny для вашего ответа. hmm, я создал модель объединения и добавил новые ассоциации в user.rb и advice.rb. Но я действительно не понимаю, что делать дальше. У вас есть пример? – Ryley38

+0

@ Ryley38 добавил некоторые изменения. Я могу объяснить, если понадобится. – toddmetheny

+0

Я также добавил некоторые изменения. Спасибо за эти подробности. Да, я намеревался отобразить совет, если завершенное логическое значение «ложно». В настоящее время, щелкнув ссылку в представлении, пользователь вызывает «полное» действие, которое изменяет значение булева. Итак, это действие должно создать запись user_advice? Извините за новый вопрос, но какой способ создать его с помощью действия? – Ryley38