假设我的用户有以下项目:
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
但很明显,这不是访问所有者对象的最佳方式。什么是正确的方法?
答案 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