【问题标题】:Accessing attributes from different associated models rails 3从不同的关联模型访问属性 rails 3
【发布时间】:2012-12-13 18:41:43
【问题描述】:

我希望更好地了解活动模型/记录关系以及如何根据属性所在的位置(模型)以及我调用它们的位置来调用属性。因此,例如,我可以像这样从配方控制器中访问属性 disc_name

 def all_recipes
@recipes = Recipe.all
 end

在视图中

<% @recipes.each do |r| %>
<%= r.dish_name %>
<% end %>

现在假设我想从我的控制器中访问一个名为 worldrecipes 的食谱属性,并且我刚刚编写了一个返回同一国家/地区的所有食谱的方法。一个国家有许多食谱作为关系

所以我的方法是

def self.top_countries
joins(:recipes).
  select('countries.*, count(*) AS recipes_count').
  group('countries.id').
  order('recipes_count DESC')
 end

我的控制器

@worldrecipes = Country.where(:name => params[:name])

并查看

<% @worldrecipes.each do |r|  %>
<%= r.name %>
<% end %>

所以访问国家名称属性很容易,因为它在国家模型中,这就是我的查询结果从(我认为)返回的地方......我的问题是我如何从我的食谱模型访问dish_name 属性国家名称的链接

希望这是有道理的,有没有人有关于如何解决这个问题的指南或一些黄金法则

谢谢

【问题讨论】:

  • @worldrecipes = Country.where(:name =&gt; params[:name])' give you the country record with name as params[:name]` 还是那个国家的食谱数组??
  • 它给了我记录名称为 params[:name] 因为在我看来我在页面上打印了“Italy”这个词,这并不完全正确,因为意大利有 2 条记录,只有 1 条正在显示

标签: ruby-on-rails-3 activerecord activemodel


【解决方案1】:

我认为你需要的是:

@country=Country.where(:name=>params[:name]).first
@worldrecipes=@country.recipes

在视图中:

<% @worldrecipes.each do |r|  %>
  <%= r.dish_name %>
<% end %>

这将打印由params[:name]提供的名称的国家/地区食谱的菜名

编辑: 好的,让我为您解决这个问题:)

您的模型关系设置为每个国家/地区都有许多食谱。即一个国家有很多食谱。

原来如此,

has_many :recipes

在 country.rb 和

belongs_to :country

在recipe.rb中

现在,当您想访问属于某个国家/地区的所有食谱时,您所做的就是调用country_record.recipes(country_record 是您需要的国家/地区记录的对象)。

当你打电话时, Country.where(:name=>params[:name]) 您实际得到的是代表 COUNTRY 本身的活动记录对象,而不是该国家的食谱,这就是打印意大利的原因。

希望这对您有所帮助。

【讨论】:

  • 现在我得到了 #<:relation:0x96983c8> 的未定义方法 `recipes'
  • 检查您的模型文件。你创建了关系吗?
  • 关系如你所说
  • 你的回答也有效,抱歉我不能同时标记这两个......不过你的方式看起来更干净吗?
【解决方案2】:

对于初学者,您要确保在模型中设置了关联:

country.rb

class Country < ActiveRecord::Base  
  has_many :recipes
end

recipe.rb

class Recipe < ActiveRecord::Base  
  belongs_to :country
end

如果您还没有这样做,请通过运行以下迁移将 foreign_key 属性添加到您的配方模型:

rails g migration add_country_id_to_recipe country_id:integer

现在您的关联已经到位,您可以轻松查询国家/地区的相应食谱。在您的控制器中:

@worldrecipes = Country.where(:name => params[:name])

那么在你看来:

<% @worldrecipes.each do |c|  %>
  <% c.recipes.each do |r| %>
   <%= r.dish_name %>
  <% end %>
<% end %>

关于“黄金法则”,我强烈建议您查看Association Basics。这是概述您可以对关联进行哪些操作的首选之地。

【讨论】:

  • 从数据库中拉取国家时不需要使用includes。它可能会浪费内存,而且通常只有一个国家,如果你知道我在说什么的话。
  • 好的,所以有一个嵌套块,现在我对输出感到困惑,它打印出了我所有的食谱及其所有属性,我的关联就像你所说的那样,它们已经从开始
  • 从视图的第 2 行删除 =
  • @stevanity 对,我将把优化留给 OP。哦,对 = 的关注度很高。查看更新的视图代码。
  • 闲逛一下,我会打印出每个意大利食谱的菜名...谢谢大家,我可以阅读哪些文档来理解这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多