Rails与连接示例的活动记录关联

时间:2014-09-17 09:45:55

标签: ruby-on-rails rails-activerecord

我正在尝试使用关联。我一直在关注RailsGuides,但没有灯泡。我能够完成我想要的东西,但我更希望它更优雅。现在,我正在进行三次activerecord查找,而我认为简单的连接会更有效率。使用.join方法最终会出现错误消息,所以我在这里寻求帮助找到灯开关。我正在使用Rails 4.1.6

模特:

# models

class Chicken < ActiveRecord::Base
  has_one :cage

  # id, name, age
end

class Cage < ActiveRecord::Base
  belongs_to :chicken
  belongs_to :farm

  # id, cage_number, rack, chicken_id, farm_id
end 

class Farm < ActiveRecord::Base
  has_many :cages

  # id, city
end

控制器:

# controller

def display
@the_chicken = Chicken.find_by_name("Alfred")
@the_cage = Cage.find_by_chicken_id(@the_chicken.id)
@the_farm = Farm.find(@the_cage.farm_id)
end

观点:

<%= @the_chicken.name %>
<%= @the_chicken.age %>
<%= @the_cage.rack +  ": " + the_cage.cage_number %>
<%= @the_farm.city %>

谢谢!

2 个答案:

答案 0 :(得分:2)

我没有看到任何理由在你说的内容中使用join,但你应该利用你的联想:

@the_chicken = Chicken.find_by(name: "Alfred")
@the_cage = @the_chicken.cage
@the_farm = @the_chicken.farm

我觉得您希望加载您可以使用includes执行的数据。当您获取鸡群以避免N + 1时,这非常有用。

如果您执行Chicken.includes(:cage, :farm).find_by_name("Alfred"),则仍然有3个查询

答案 1 :(得分:2)

在您的显示方法中,您可以使用以下关联:

def display
  @the_chicken = Chicken.find_by_name("Alfred")
  @the_cage = @the_chicken.cage
  @the_farm = @the_cage.farm
end

你认为还有一件事没有@。一定是个错字。所以它应该像

<%= @the_chicken.name %>
<%= @the_chicken.age %>
<%= @the_cage.rack +  ": " + @the_cage.cage_number %>
<%= @the_farm.city %>

你应该在鸡和农场之间建立一种联系。

class Chicken < ActiveRecord::Base
  has_one :cage
  belongs_to :farm, through :cage
  # id, name, age
end

class Cage < ActiveRecord::Base
  belongs_to :chicken
  belongs_to :farm

  # id, cage_number, rack, chicken_id, farm_id
end 

class Farm < ActiveRecord::Base
  has_many :cages
  has_many :chickens, through :cage
  # id, city
end

所以你可以直接从鸡肉中找到农场。

@the_farm = @the_chicken.farm