用户、表单和任务关联 rails
Users, form and tasks association rails
我有一个应用程序允许用户填写一个表格(名为 "checklist"),然后有一个他必须完成的任务列表。任务(名为 "advices")与用户在表单中给出的答案相关。
例如,如果问题是 "have you cooked dinner ?",而用户回答 "no",则将显示建议 "go cook dinner"。
完成建议后,用户可以将其标记为已完成。所有用户的建议都是一样的。它们已由管理员在应用程序中创建。
所以用户有一个checklist,checklist属于一个用户。
我遇到的问题是:当用户将建议标记为已完成时,它对所有用户都标记为已完成。不应该。
我不太确定如何解决这个问题。建议和用户之间的关联 "Has-many" 和 "Belongs_to" 应该不起作用,因为用户没有创建建议 ?
我是 rails 的新手,所以如果有人能提供帮助,我会很高兴。
请注意,我使用 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
您需要一个连接模型。
$ 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
当勾选某些内容时在连接模型中创建一条记录,然后查询该记录table以确保为单个用户完成任务。
因此,当用户勾选任务并提交时,您实际上创建了一个包含 advice_id
和 user_id
的记录,而不是使用 completed
布尔值.然后,如果该建议存在该记录,则应为该用户选中该记录。这有意义吗?
例如,如果您向完成任务的用户隐藏已完成的任务,您可以说
<% if UserAdvice.where(user_id: current_user.id, advice_id: advice.id).count > 0 %>
这会起作用,一开始没问题,但这样做可能会降低您的应用程序的速度。如果有很多建议,您可能想要做的是 运行 查询一次并获取所有 user_advice
记录并提取 ID。然后根据单个记录检查该 ID 数组。
在你的控制器中
# 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 %>
编辑:
要在该完整操作中创建记录:
def complete
UserAdvice.create(user_id: current_user.id, advice_id: @advice.id)
redirect_to root_path
end
我有一个应用程序允许用户填写一个表格(名为 "checklist"),然后有一个他必须完成的任务列表。任务(名为 "advices")与用户在表单中给出的答案相关。 例如,如果问题是 "have you cooked dinner ?",而用户回答 "no",则将显示建议 "go cook dinner"。
完成建议后,用户可以将其标记为已完成。所有用户的建议都是一样的。它们已由管理员在应用程序中创建。
所以用户有一个checklist,checklist属于一个用户。
我遇到的问题是:当用户将建议标记为已完成时,它对所有用户都标记为已完成。不应该。
我不太确定如何解决这个问题。建议和用户之间的关联 "Has-many" 和 "Belongs_to" 应该不起作用,因为用户没有创建建议 ?
我是 rails 的新手,所以如果有人能提供帮助,我会很高兴。 请注意,我使用 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
您需要一个连接模型。
$ 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
当勾选某些内容时在连接模型中创建一条记录,然后查询该记录table以确保为单个用户完成任务。
因此,当用户勾选任务并提交时,您实际上创建了一个包含 advice_id
和 user_id
的记录,而不是使用 completed
布尔值.然后,如果该建议存在该记录,则应为该用户选中该记录。这有意义吗?
例如,如果您向完成任务的用户隐藏已完成的任务,您可以说
<% if UserAdvice.where(user_id: current_user.id, advice_id: advice.id).count > 0 %>
这会起作用,一开始没问题,但这样做可能会降低您的应用程序的速度。如果有很多建议,您可能想要做的是 运行 查询一次并获取所有 user_advice
记录并提取 ID。然后根据单个记录检查该 ID 数组。
在你的控制器中
# 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 %>
编辑:
要在该完整操作中创建记录:
def complete
UserAdvice.create(user_id: current_user.id, advice_id: @advice.id)
redirect_to root_path
end