ruby-on-rails 有没有办法根据另一个表中的列来确定acts_as_list的范围?

k5ifujac  于 2023-01-27  发布在  Ruby
关注(0)|答案(1)|浏览(103)

TLDR:是否有办法将acts_as_list的范围扩大到另一个表中

class SprintTodo < ApplicationRecord
  belongs_to :sprint
  belongs_to :todo
  acts_as_list scope: [:sprint, :todo.status]
end

我有两个表和一个连接表。

  1. Todo(name, position, status, parent, children, ...)
  2. SprintTodo(todo_id, sprint_id, position)
  3. Sprint(name, start_date, end_date, ...)
    Todo根据其父项(树)拥有自己的位置,而SprintTodo根据其状态保留看板中的位置。
    我现在面临的问题是我不能进入Todo表来确定它的范围,一个解决方案(虽然不好)是在SprintTodo中复制Todo的状态,但这将是一个糟糕的设计。
    有没有其他方法可以让我了解情况?
v2g6jxz6

v2g6jxz61#

SprintTodo中添加一个status列可能会更简单,但是有一种方法:

class SprintTodo < ApplicationRecord
  belongs_to :todo
  belongs_to :sprint

  acts_as_list scope: "sprint_todos.id IN (\#{todo_status_sql}) AND sprint_todos.sprint_id = \#{sprint_id}"

  def todo_status_sql
    SprintTodo.select(:id).joins(:todo).where(todo: { status: todo.status }).to_sql
  end
end
Sprint.create!
Todo.create!([{ status: :one }, { status: :one }, { status: :two }, { status: :two }])
Sprint.first.todos << Todo.all
Sprint.create!
Sprint.second.todo << Todo.create(status: :one)

>> SprintTodo.all.as_json(only: [:position, :sprint_id], include: {todo: {only: [:status, :id]}})
=> 
[{"position"=>1, "sprint_id"=>1, "todo"=>{"id"=>1, "status"=>"one"}},
 {"position"=>2, "sprint_id"=>1, "todo"=>{"id"=>2, "status"=>"one"}},

 {"position"=>1, "sprint_id"=>1, "todo"=>{"id"=>3, "status"=>"two"}},
 {"position"=>2, "sprint_id"=>1, "todo"=>{"id"=>4, "status"=>"two"}},

 {"position"=>1, "sprint_id"=>2, "todo"=>{"id"=>5, "status"=>"one"}}]
#             ^               ^                               ^
#     positioned        by sprint                 and todo.status
  • 网址:http://www.example.comwww.rubydoc.info/gems/acts_as_list/0.8.2/ActiveRecord/Acts/List/ClassMethods#acts_as_list-instance_method*

相关问题