如何在 rails 上的 ruby 中显示 parent table 列名称?
How to show parent table column name in ruby on rails?
如何在 rails 的 ruby 中显示 parent table 列名称?
我想显示 company_name 位于 company_id 就像 1,post 是 child table 名称,其中外键 company_id,我想替换位于 company_id.
的 company_name
这是我的作品-
控制器:
@post = Post.paginate(page: params[:page], :per_page => 10).order('job_view_count DESC')
查看:
<% @post.each do |p| %>
<%= p.jpost_title %>
<%= p.company_id %> # I want to show company_name on this place
<%= p.post_location %>
<% end %>
用户模型:
class User< ActiveRecord::Base
has_many :posts, :foreign_key => :company_id
has_many :companies
end
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :company
end
谢谢
您可以只执行 <%= p.company.campany_name %>
来显示公司名称而不是 company_id
。
<% @post.each do |p| %>
<%= p.jpost_title %>
<%= p.company.company_name %>
<%= p.post_location %>
<% end %>
保持干爽并停止 Post
模型中的 law of demeter issue, you'll want to use .delegate
:
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :company
delegate :company_name, to: :company #-> @post.company_name
end
这将允许您使用:
<% @post.each do |p| %>
<%= p.jpost_title %>
<%= p.company_name %>
<%= p.post_location %>
<% end %>
为了给你上下文(让你理解问题/解决方案),company_id
是 posts
table.
里面的 foreign key
外键是一种关系数据库功能 - 它允许数据库通过您提供的密钥 "reference" 其他 table 中的数据:
在您的例子中,company_id
表示您的 post 的 Company
记录的 id
。你遇到的问题是,当直接调用它时,你会得到一个 integer
返回(company_id
id)。
要拉出关联对象 (IE @post.company
),您需要依靠 ActiveRecord 来填充它...这就是为什么您应该调用 @post.company
(IE post belongs_to company
) 以访问其 name
等属性:
@post.company_id #-> 1
@post.company.company_name #-> "Test"
使用 delegate
将您的特定请求推送到 company
对象,允许您直接调用 @post
对象上定义的方法。
在您的 Post
模型中您有 belongs_to :company
,因此您可以通过 post.company
.
访问 Company
在 Pavan 的回答中,如果 Post
没有 Company
,您会得到一个错误。
我认为你应该在你的 Post
模型中添加验证:
validates :user_id, :company_id, presence: true
如果您认为 Post
不需要 Company
,您可以将您的观点更改为:
<% @posts.each do |p| %>
<%= p.jpost_title %>
<%= p.company %>
<%= p.post_location %>
<% end %>
并在您的 Company
模型中添加一个 to_s
方法:
# Returns name if present, otherwise id
def to_s
name || id
end
(我建议使用 @posts
而不是 @post
,因为对多个对象使用复数形式是一种惯例。)
如何在 rails 的 ruby 中显示 parent table 列名称?
我想显示 company_name 位于 company_id 就像 1,post 是 child table 名称,其中外键 company_id,我想替换位于 company_id.
的 company_name这是我的作品-
控制器:
@post = Post.paginate(page: params[:page], :per_page => 10).order('job_view_count DESC')
查看:
<% @post.each do |p| %>
<%= p.jpost_title %>
<%= p.company_id %> # I want to show company_name on this place
<%= p.post_location %>
<% end %>
用户模型:
class User< ActiveRecord::Base
has_many :posts, :foreign_key => :company_id
has_many :companies
end
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :company
end
谢谢
您可以只执行 <%= p.company.campany_name %>
来显示公司名称而不是 company_id
。
<% @post.each do |p| %>
<%= p.jpost_title %>
<%= p.company.company_name %>
<%= p.post_location %>
<% end %>
保持干爽并停止 Post
模型中的 law of demeter issue, you'll want to use .delegate
:
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :company
delegate :company_name, to: :company #-> @post.company_name
end
这将允许您使用:
<% @post.each do |p| %>
<%= p.jpost_title %>
<%= p.company_name %>
<%= p.post_location %>
<% end %>
为了给你上下文(让你理解问题/解决方案),company_id
是 posts
table.
foreign key
外键是一种关系数据库功能 - 它允许数据库通过您提供的密钥 "reference" 其他 table 中的数据:
在您的例子中,company_id
表示您的 post 的 Company
记录的 id
。你遇到的问题是,当直接调用它时,你会得到一个 integer
返回(company_id
id)。
要拉出关联对象 (IE @post.company
),您需要依靠 ActiveRecord 来填充它...这就是为什么您应该调用 @post.company
(IE post belongs_to company
) 以访问其 name
等属性:
@post.company_id #-> 1
@post.company.company_name #-> "Test"
使用 delegate
将您的特定请求推送到 company
对象,允许您直接调用 @post
对象上定义的方法。
在您的 Post
模型中您有 belongs_to :company
,因此您可以通过 post.company
.
Company
在 Pavan 的回答中,如果 Post
没有 Company
,您会得到一个错误。
我认为你应该在你的 Post
模型中添加验证:
validates :user_id, :company_id, presence: true
如果您认为 Post
不需要 Company
,您可以将您的观点更改为:
<% @posts.each do |p| %>
<%= p.jpost_title %>
<%= p.company %>
<%= p.post_location %>
<% end %>
并在您的 Company
模型中添加一个 to_s
方法:
# Returns name if present, otherwise id
def to_s
name || id
end
(我建议使用 @posts
而不是 @post
,因为对多个对象使用复数形式是一种惯例。)