我正在为用户使用Devise。
User.rb
belongs_to shop
has_many tasks
Show.rb
has_many users
has_many tasks
Task.rb
belongs_to user
belongs_to shop
当我创建新任务时:
current_user.tasks.create(...)
shop_id
获取的值为nil,当我需要与用户相同时为shop_id
。
当我创建新任务时
current_user.shop.tasks.create(...)
我将user_id设为nil,但为shop_id
获取了正确的值。
我缺少什么?
提前感谢。
答案 0 :(得分:0)
何时
current_user.tasks.create(...)
运行rails关联不会知道它必须填充shop_id,除非你明确发送它
current_user.tasks.create(shop_id: current_user.shop.id)
相反的方式。您可以为此案例使用更好的建模,并在用户,商店和任务之间建立多态关联。更多细节和示例可以在这里找到。
请参阅 http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
不要认为这与设计有关。
答案 1 :(得分:0)
在current_user.shop.tasks.create(...)
中,您直接在create
集合上致电tasks
以获取单数shop
。这实际上相当于:
Shop.find_by(user_id: current_user.id).tasks.create(...)
商店可能有多个用户,因此该声明中没有明确说明新创建的任务应属于current_user
。
我认为最简单的解决方案是自己创建任务,明确设置两个外键:
Task.create(shop_id: current_user.shop_id, user_id: current_user.id)
虽然您必须重新加载user
和shop
引用,才能获取新关联的task
。
如果您想要更自动的内容,请考虑在用户has_many :tasks
内使用关联回调,其中shop_id
的{{1}}来自Task
的shop_id:< / p>
user
答案 2 :(得分:0)
Devise current_user
方法返回用户的同一对象。
# simple example
def sign_in
session[:current_user] = User.find_by_email(params[:email])
end
def current_user
session[:current_user]
end
如果用户已登录,则current_user
方法应该可以正常工作,如右下方所示。
#1
current_user.tasks.create(...)
#2 you can also like this
t = Task.new(...)
t.user_id = current_user.id
t.save
您可以在rails console
中玩,易于理解。
current_user = User.first
current_user.tasks.create(...)