我正在使用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
在这种情况下,最好的方法是什么? 谢谢你的帮助!
答案 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