Rails从has_many的AR关系中获取父级

时间:2016-07-19 15:01:18

标签: ruby-on-rails ruby

我的模型Client has_many :analyticsAnalytic belongs_to :client。我在分析模型中编写了一个方法来为给定的客户端更新自己,并且基本上想要调用Client.find(xx).analytics.update_analytics(arg1, arg2,..)

Analytic.rb中的代码如下所示:

def self.update_analytics(arg1, arg2, ...)
  client = self.client
  //go_get_some_data
  client.analytics.create(...)
end

self.client错误undefined methodself.parent只返回Object,但我无法从父级调用self.parent.id或其他属性。

如何获取调用Client方法的analytics.update_analytics实例?

3 个答案:

答案 0 :(得分:0)

以self为前缀的方法是一个类方法,您需要在Analytic模型中使用实例方法

def update_analytics
  self.client # this should already be set or you would never be able to loop through a client's analytics. when creating analytics you should be assigning the client_id prior to calling this method or it would never work
end

此外,您需要遍历属于客户端的所有分析并在每个对象上调用update_analytics方法

@client = Client.find(xx)
@client.analytics.each do |analytic|
  analytic.update_analytics(arg1, arg2,..)
end

答案 1 :(得分:0)

致电时

do.call(rbind, strsplit(df$Time, "\\s(?=\\d)", perl = T))
#      [,1]       [,2]      
# [1,] "Week End" "07-01-10"
# [2,] "Week End" "07-02-10"

在幕后它将是:

Client.find(xx).analytics

其实这一行:

SELECT * FROM clients WHERE id = xx
SELECT * FROM analytics WHERE client_id = xx

无效,因为 Client.find(xx).analytics.update_analytics(arg1, arg2,..) 会返回分析数组。所以你必须迭代它们并调用一些方法。

答案 2 :(得分:0)

如果方法以self.开头,则它是一个Class方法,因此必须在类本身上调用。 例如 Analytics.update_analytics(arg1, arg2,...) 但我确定这不是你想要做的。

Client.find(xx).analytics将返回一个数组。因此,您的类方法self.update_analytics无法在Client.find(xx).analytics上运行(它将返回一个数组)。

根据您对第一个答案的评论,您只想获取新数据,并更新客户端实例。我想你可以通过将它作为模块或服务来实现,并将Client实例作为第一个参数,然后将其他参数作为其他参数。 这不是一个确切的答案,但它可能会让您了解如何解决您的问题。

相关问题