什么方法会从类方法返回ActiveRecord所有者对象?

时间:2016-01-27 15:25:39

标签: ruby-on-rails activerecord

假设我的用户有以下项目:

class User < ActiveRecord::Base
  has_many :items
end
class Item < ActiveRecord::Base
  belongs_to :user
end

现在我想为项目添加一个类方法,以便创建自定义记录:

def self.create_personalized
  create description: "#{user.name}' item"
end

但是,当然,由于这是一个类方法,user未定义。但是如果我使用user.items.create_personalized来调用它,那么通过该关系就会有一个关联的用户。我知道Item.create_personalized知道用户,因为这有效:

def self.create_personalized
  item = create
  item.update_attribute :description, "#{item.user.name}'s item"
end

但很明显,这不是访问所有者对象的最佳方式。什么是正确的方法?

2 个答案:

答案 0 :(得分:3)

如果你这样做

Item.scope_attributes

然后,您将获得当前作用域中适用于项目的任何属性的哈希值。如果您调用create,则会从范围中提取这些内容。这些是数据库级别属性,因此您将获得用户ID而不是用户本身。

答案 1 :(得分:3)

我找到的最佳选择是current_scope.proxy_association.owner。它仍然有点间接,但它返回我正在寻找的确切对象。

def self.create_personalized
  user = current_scope.proxy_association.owner
  create description: "#{user.name}'s item"
end