我正在尝试做一些与这个问题非常相似的事情
我有 4 个模型,其中一个(CoffeeBlend)是一个连接表:
class CoffeeRoast < ApplicationRecord
has_many :coffee_blends
has_many :coffee_beans, through: :coffee_blends
has_one :country, through: :coffee_beans
end
class CoffeeBean < ApplicationRecord
has_many :coffee_blends
has_many :coffee_roasts, through: :coffee_blends
belongs_to :country
end
class Country < ApplicationRecord
has_many :coffee_beans
end
class CoffeeBlend < ApplicationRecord
belongs_to :coffee_bean
belongs_to :coffee_roast
end
我的coffee_beans
表有一个名为 country_id
的列,其中填充了countries
表中的 id。
在我的coffee_roasts_show
中,我希望能够拉出咖啡豆的相关国家。我的最新尝试看起来像
<% @coffee_roast.coffee_beans.country.country_name %>
这给了undefined method 'country'
或
<% @coffee_roast.coffee_beans.countries.country_name %>
返回undefined method 'countries'
我的关联是否正确? 我的节目代码有误吗?
该方法@coffee_roast.coffee_beans
返回关联,而不是单个记录。这就是为什么你不能就此打电话给#country
。如果您需要所有国家/地区,则可以使用#map
:
<% @coffee_roast.coffee_beans.map {|cb| cb.country.country_name } %>
编辑:
如果您想在浏览器中显示列表,请在您的 ERB 标记中添加=
:
<%= @coffee_roast.coffee_beans.map {|cb| cb.country.country_name } %>
将 contry 名称显式转换为带有 Array#join
的字符串也可能很有用
<%= @coffee_roast.coffee_beans.map {|cb| cb.country.country_name }.join(', ') %>