嵌套模型的多个t.references为零

时间:2016-04-08 21:31:29

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

我正在为用户使用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获取了正确的值。

我缺少什么?

提前感谢。

3 个答案:

答案 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)

虽然您必须重新加载usershop引用,才能获取新关联的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(...)