ActiveRecord:has_many并包含

时间:2017-05-30 19:54:20

标签: ruby-on-rails ruby activerecord has-many

我正在使用rails 4.2.0 - 这是我的模型:

magic

现在,我想显示客户的所有合同。根据{{​​3}},我应该可以这样做:

>functionBody(magic)

# { 
#     if (length(n) > 1) { 
#         return(sapply(n, match.fun(sys.call()[[1]]))) 
#     } 
#     n <- round(n) 
#     if (n == 2) { 
#         stop("Normal magic squares of order 2 do not exist") 
#     } 
#     if (n%%2 == 1) { 
#         return(as.standard(magic.2np1(floor(n/2)))) 
#     } 
#     if (n%%4 == 0) { 
#         return(as.standard(magic.4n(round(n/4)))) 
#     } 
#     if (n%%4 == 2) { 
#         return(as.standard(magic.4np2(round((n - 2)/4)))) 
#     } 
#     stop("This cannot happen") 
# }

然而,它不起作用。这是错误消息:

class Customer < ApplicationRecord
  has_many :meters, -> { includes :contracts }
end

class Meter < ApplicationRecord
  belongs_to :customer
  has_many :contracts
end

class Contract < ApplicationRecord
  belongs_to :meter
end

在这种情况下,最好的方法是什么? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

每个模型类(如您的示例中)仅表示数据库记录的其中一个实例,即if(hourNames[realHour].equals("una")) 类仅代表Meter表中的一个meter行。因此,考虑到这一点,您可以看到声明meters meter has_many表示这些contracts个实例中的每一个都有很多meter。< / p>

让我们打破这一行:contracts

您有@customer.meters.contracts个实例,而且您要求所有的米:@customer。该@customer.meters方法的返回是属于该meters的{​​{1}}的集合。由于它是具有许多合同的meters的实例,因此您不能以这种方式询问合同的计量表。

您可以通过以下方式询问单个仪表:@customer或者您可以遍历所有仪表并获得所有合同:

meter

或者,更一般地说,您可能希望在视图中显示客户合同的列表:

@customer.meters.first.contracts

但是,您可以通过@customer.meters.flat_map(&:contracts) # => an array of all the contracts 关联将所有<% @customer.meters.each do |meter| %> <% meter.contracts.each do |contract| // display the contract <% end %> <% end %> contracts相关联:

customer

通过添加meters,您说客户记录通过联接表class Customer < ApplicationRecord has_many :meters, -> { includes :contracts } # ActiveRecord's shorthand declaration for associating # records through a join table, in this case 'meters' has_many :contracts, through: :meters end 与另一个表has_many X, through: Y中的记录相关联。

有了这个,给定X现有Y且这些表格已存在customer,您就可以调用meters,ActiveRecord将获取{{ 1}}将客户的contracts加入@customer.contracts并返回contracts集合。

关于Rails的更多信息通过关联:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association