所以这就是事情:
class Car < ActiveRecord::Base
has_many :wheels
end
class Wheel < ActiveRecord::Base
belongs_to :car
end
c = Car.first
p c.to_s
c.wheels.each do |w|
p w.car.to_s
end
输出:
"#<Car:0x00000001a4f2d0>"
"#<Car:0x00000001aee880>"
"#<Car:0x00000001ae2300>"
"#<Car:0x00000001ad5ab0>"
"#<Car:0x00000001aca0e8>"
我绝对相信我不想在数据库中搜索并为每个轮子加载新的汽车实例。你会建议什么策略?我不知道从哪里开始......
(我打算加入wheel.car
的地方非常深,以至于根本无法抓住汽车的实例)
修改 (@BillyChan&amp; @NitinJ问题的答案) 这个例子粗略简化,但我会尽力坚持下去。收起来我不喜欢从db中为每个关联重新加载的想法(但我想这只是程序员如何编写代码)我实际上有这个原因,让我试着解释如下: 考虑cancan ability.rb:
can :be_taken_off, Wheel do |w|
!w.car.is_mooving?
end
所以要回答最近点(感谢@ChrisPeters&amp; @NitinJ):
//in controller
@car = Car.first include: [wheels: :car]
@car.stop_moving
//in view
<% for wheel in @car.wheels %>
<%= link_to 'take off', '..' if current_user.can? :be_taken_off, wheel %>
<% end %>
但是再次:
(更适合我的方法)因为a)加载@car
实例是在cancan的load_and_authorize_resource
和b)中挖出的,即使我要覆盖这个方法(实际上是简单的任务),总是加载所有并不好轮子..我想我会以此结束:
<% if @car.has_wheels? %>
<% for wheel in @car.wheels %>
<% wheel.car = @car %>
<%= link_to 'take off', '..' if current_user.can? :be_taken_off, wheel %>
<% end %>
<% end %>
我很想找到这样的方法:@car.wheels.include(car: @car).each
所以,如果你没有更好的想法,我实际上会将@ NitinJ的答案标记为正确(虽然不适合我的情况)。不管怎样,谢谢!
答案 0 :(得分:1)
尝试使用此Car.first(include: [wheels: :car])
,这只会运行一个查询。但我不喜欢重装汽车的想法
答案 1 :(得分:0)
也许你想这样做,
@car = Car.first # The car instance
@car.wheels.each do |wheel|
p wheel.name # different name, since there are different wheels for one car(@car)
p @car.name # same name, since its the same car
end