ActiveAdmin 在索引页上显示嵌套属性
ActiveAdmin display nested attributes on index page
如何在索引页上以逗号分隔的列显示嵌套资源?
我有3个模型
models/job.rb
class Job < ActiveRecord::Base
validates :title, presence: true
validates :company, presence: true
validates :url, presence: true
has_many :position_type_joins
has_many :position_types, through: :position_type_joins
accepts_nested_attributes_for :position_types, :allow_destroy => true
end
models/position_type.rb
class PositionType < ApplicationRecord
has_many :position_type_joins
has_many :jobs, through: :position_type_joins
end
models/position_type_join.rb
class PositionTypeJoin < ApplicationRecord
belongs_to :job
belongs_to :position_type
end
我已成功自定义表单页面,因此它现在将职位类型列为复选框,我设置的当前值为 "Permanent, Full time, Part time, Contract, Internship, Volunteer"。
我正在努力解决的问题是如何自定义 ActiveAdmin 索引页面,以便出现一个标题为 "Position type" 的列,然后每个作业列出已分配的职位类型值。例如:
+-------------------+----------------------+
| Job title | Position Type |
+-------------------+----------------------+
| Painter | Contract, Part time |
| Library Assistant | Part time, Volunteer |
+-------------------+----------------------+
我确实在类似的问题中看到过这种语法,但我无法让它为我工作。
Show child/nested attributes in ActiveAdmin index view column
index do
column :code
column 'Sales Agent' do |client|
client.sales_agent.agent_name if !client.sales_agent.nil?
end
end
我尝试根据需要编辑它
index do
column 'Position type' do |job|
job.position_type.name if !job.position_type.name?
end
end
我得到的错误是
undefined method `position_type'
我是 rails 上的 ruby 的新手,如果我遗漏了一些明显的东西,我深表歉意。非常感谢任何帮助。
问题是您在 job
中调用 position_type
,但它有很多 position_types
。所以正确的调用应该是 job.position_types
并在有很多的情况下迭代它们,或者如果你只想要第一个 job.position_types.first
.
注意: 请记住,这将生成 N+1 个查询,应该通过预先加载 scoped_collection
中的关联来解决。
试试这样的东西:
index do
column 'Position type' do |job|
job.position_types.map(&:name).join(',')
end
end
要提高 SQL 的效率,请尝试:
controller do
def scoped_collection
super.includes(:jobs)
end
end
如何在索引页上以逗号分隔的列显示嵌套资源?
我有3个模型
models/job.rb
class Job < ActiveRecord::Base
validates :title, presence: true
validates :company, presence: true
validates :url, presence: true
has_many :position_type_joins
has_many :position_types, through: :position_type_joins
accepts_nested_attributes_for :position_types, :allow_destroy => true
end
models/position_type.rb
class PositionType < ApplicationRecord
has_many :position_type_joins
has_many :jobs, through: :position_type_joins
end
models/position_type_join.rb
class PositionTypeJoin < ApplicationRecord
belongs_to :job
belongs_to :position_type
end
我已成功自定义表单页面,因此它现在将职位类型列为复选框,我设置的当前值为 "Permanent, Full time, Part time, Contract, Internship, Volunteer"。
我正在努力解决的问题是如何自定义 ActiveAdmin 索引页面,以便出现一个标题为 "Position type" 的列,然后每个作业列出已分配的职位类型值。例如:
+-------------------+----------------------+
| Job title | Position Type |
+-------------------+----------------------+
| Painter | Contract, Part time |
| Library Assistant | Part time, Volunteer |
+-------------------+----------------------+
我确实在类似的问题中看到过这种语法,但我无法让它为我工作。
Show child/nested attributes in ActiveAdmin index view column
index do
column :code
column 'Sales Agent' do |client|
client.sales_agent.agent_name if !client.sales_agent.nil?
end
end
我尝试根据需要编辑它
index do
column 'Position type' do |job|
job.position_type.name if !job.position_type.name?
end
end
我得到的错误是
undefined method `position_type'
我是 rails 上的 ruby 的新手,如果我遗漏了一些明显的东西,我深表歉意。非常感谢任何帮助。
问题是您在 job
中调用 position_type
,但它有很多 position_types
。所以正确的调用应该是 job.position_types
并在有很多的情况下迭代它们,或者如果你只想要第一个 job.position_types.first
.
注意: 请记住,这将生成 N+1 个查询,应该通过预先加载 scoped_collection
中的关联来解决。
试试这样的东西:
index do
column 'Position type' do |job|
job.position_types.map(&:name).join(',')
end
end
要提高 SQL 的效率,请尝试:
controller do
def scoped_collection
super.includes(:jobs)
end
end