我正在尝试使用关联。我一直在关注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 %>
谢谢!
答案 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