Rails关联 - 现有列表中的自定义项目列表

时间:2016-04-28 16:01:28

标签: mysql ruby-on-rails ruby ruby-on-rails-3

我正在开发一个rails应用程序,用户可以将自己想要执行的任务添加到自己的自定义列表中。每个任务也可以属于0个或更多类别。到目前为止,我已经尝试过这个:

user.rb

Public Sub RoundedRectangle1_Click()

Dim resource As Range
Dim register As Range
Dim cancel As Range

Set resource = Worksheets("Resource List1").Cells(2, 4)
Set register = Worksheets("Registered List").Cells(2, 1)
Set cancel = Worksheets("Cancelled List").Cells(2, 1)


Call findRegister(resource, register)

End Sub

Public Sub findRegister(ByRef resource As Range, ByRef register As Range)

Dim i As Integer

i = 0

Do While resource.Offset(i, 3) <> ""

If resource.Offset(i, 3).Value = register.Range("A2").Value Then

resource.Offset(i, 3).Cells.Interior.ColorIndex = 37

End If

i = i + 1

Loop

End Sub

user_list.rb

has_one :user_list
has_many :tasks, through: :user_list

tasks.rb

belongs_to :user
has_many   :tasks

[时间戳} _migration.rb

has_and_belongs_to_many :categories

我遇到的问题是在控制台中我尝试运行create_table :user_lists do |t| t.integer :user_id t.integer :task_id t.timestamps null: false end ,在使用以下查询时无法找到列User.find(1).tasks

tasks.user_list_id

此查询应该使用user_lists表上的tasks id加入tasks表中的tasks id。协会是否正确,如果是,我该怎么做才能更改查询?

2 个答案:

答案 0 :(得分:3)

要允许将任务放在许多列表上,您需要一个连接user_liststasks表的M2M连接表。

class User < ActiveRecord::Base
  has_many :user_lists
  has_many :tasks, through: :user_lists
end

class Task < ActiveRecord::Base
  has_many :user_list_items
  has_many :user_lists, through: :user_list_items
end

class UserListItem < ActiveRecord::Base
  belongs_to :task
  belongs_to :user_list
  has_one :user, through: :user_list
  # optional
  validates_uniqueness_of :task_id, scope: :user_list_id
end

class UserList < ActiveRecord::Base
  belongs_to :user
  has_many :user_list_items
  has_many :tasks, through: :user_list_items
end

您可以使用以下命令创建连接模型和迁移:

rails g model UserListItem user_list:belongs_to task:belongs_to

您可能还想打开迁移并添加复合索引:

add_index :user_list_items, [:user_list_id, :task_id], unique: true

将其设置为唯一是可选的 - 但在大多数情况下,您希望连接表条目对于表A和B是唯一的。

请参阅:

答案 1 :(得分:0)

您的用例要求将任务分配给多个用户,并且用户只有一个任务列表。这听起来像是userstasks之间的HABM关联。

最简单的表达方式是:

class User
  has_and_belongs_to_many: :tasks
  ...
end

class Task
  has_and_belongs_to_many: :users
  ...
end

以及用于创建连接表的迁移:

create_join_table :users, :tasks, do |t|
  t.index :user_id
  t.index.task_id
end

在您需要跟踪其他属性之前,您不需要创建TaskUser模型来匹配连接表。 Rails会自动处理这个问题。

如果用户需要多个任务列表,则您需要该TaskList模型。让我知道,我会更新我的答案。

以下是HABMjoin migration

的文档