我试图从rails获取一段复杂的数据。
我想要的是所有用户,与他们相关的任务以及仅限于特定项目。
这里是参考的任务架构:
Cannot add or update a child row: a foreign key constraint fails (`database`.`#sql-45e3_695`, CONSTRAINT `FKfkqyncksuk5vuw09wam4sryyd` FOREIGN KEY (`profesor_id`) REFERENCES `profesor` (`id`))
端
我通过此次调用完成了部分内容
create_table "tasks", force: :cascade do |t|
t.date "start_date"
t.date "end_date"
t.integer "hours"
t.string "priority"
t.integer "project_id"
t.integer "user_id"
t.string "name"
t.string "description"
我的问题是我的查询没有正确地根据日期查找任务。
我正在尝试查找一周范围内的所有任务,这些任务在该周内具有start_date或end_date。
这可能在一个查询中,还是需要更高级的逻辑?
答案 0 :(得分:2)
如果您使用的是Rails 5,则可以使用or
method
User.joins(:tasks).where(tasks: {end_date: Date.today.beginning_of_week..Date.today.end_of_week})
.or(
User.joins(:tasks).where(tasks: {start_date: Date.today.beginning_of_week..Date.today.end_of_week})
)
为了简洁起见,我没有将项目包括在内。
答案 1 :(得分:1)
我还没有对此进行过测试,但我认为发生的事情是你抓住所有用户使用end_date在给定时间之间发生的任务,然后查询每个用户执行start_date在给定时间之间发生任务的模型。仅向您提供其任务start_date和end_date在给定时间之间发生的用户。
users = User.includes(:tasks).where('((tasks.end_date BETWEEN ? AND ?) OR (tasks.start_date BETWEEN ? AND ?)) AND tasks.project_id = ?', Date.today.beginning_of_week, Date.today.end_of_week, Date.today.beginning_of_week, Date.today.end_of_week, @project.id).references(:tasks).map { |user| user.as_json.merge({tasks: user.tasks.as_json}) }
希望它有所帮助。干杯!
答案 2 :(得分:0)
这里有什么最终为我工作,谢谢@vijay
User.includes(:tasks).where(tasks: {end_date:Date.today.beginning_of_week..Date.today.end_of_week}).or(User.includes(:tasks).where(tasks: {start_date: Date.today.beginning_of_week..Date.today.end_of_week})).where('tasks.project_id = ?', @project.id).map { |user| user.as_json.merge({tasks: user.tasks.as_json}) }