您如何将父实例强加给其子模型?

时间:2014-01-14 16:17:34

标签: ruby-on-rails activerecord

所以这就是事情:

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的答案标记为正确(虽然不适合我的情况)。不管怎样,谢谢!

2 个答案:

答案 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