多对多连接表中的额外属性

时间:2017-09-09 02:30:19

标签: ruby-on-rails ruby activerecord

我通过名为User

的联接模型在TodoUserTodo之间建立了多对多关联

在todo拥有的众多用户中,有一个所有者。因此,我在名为user_todos的{​​{1}}联接表中创建了一个列。

问题是,如何在创建Todo时填充此属性?

目前,我正在创建待办事项,然后在is_owner操作中单独更新此属性。

TodoController#create

这似乎不对。在创建@todo = current_user.todos.create(todo_params) @todo.user_todos.first.update_attribute(:is_owner, true) 时,我可以进行一次调用来填充此属性吗?

第二,有没有办法通过这种方式查询用户是否是待办事项的所有者?

todo

3 个答案:

答案 0 :(得分:1)

我会使用UserTodo类创建一个user_todo.rb文件并执行以下操作:

ut=UserTodo.new
ut.todo = Todo.create(todo_params)
ut.user = current_user
ut.is_owner = true
ut.save

current_user.todos_as_usertodos.first.is_owner?

您可以在user.rb

上制作
def todos_as_usertodos
  UserTodo.where(user_id: id).to_a
end

看看我要去哪里?您希望返回并使用UserTodo对象与Todo对象,因为它们中包含更多信息。您需要的信息。额外的is_owner布尔值。当你只转移一个简单的待办事项对象时,你会失去这些信息。

答案 1 :(得分:0)

这似乎是一种糟糕的方式,因为你使用.first来获取你的实例。我会做像

这样的事情
UserTodo.create(user: current_user, is_owner: true, todo: Todo.create(todo_params))

第二

我不确定这是否可能

答案 2 :(得分:0)

您可以使用此单行创建具有额外属性的连接模型:

x = 6;
y = 5;

由于current_user.user_todos.create(todo: Todo.create(todo_params), is_owner: true) 是联接模型的一个属性,您也必须通过该模型访问它:

is_owner