尝试实现具有一对多关联的网格视图

Trying to implement a grid view with a one-to-many association

ImageCategoryone-to-many 关联:

# Category model:
has_many :images
# Image model:
has_one :category
# Images migration file:
t.references :category, index: true, foreign_key: true

我正在尝试使用 wice_grid gem 实现网格视图。这行得通,但有一行失败了。以下在索引视图中工作:

g.column name: 'Category', attribute: 'category_id', auto_reload: true, html: {id: 'grid-cells'} do |image|
  image.category_id
end

但这显示类别的 number/id,而我希望它显示其名称。如果我尝试 image.category 而不是 image.category_id,则会出现错误:

PG::UndefinedColumn: ERROR:  column categories.image_id does not exist
LINE 1: SELECT  "categories".* FROM "categories" WHERE "categories"."image_id...

如何让它显示类别名称而不是类别 ID?

控制器方法:

def index
  @images_grid = initialize_grid(Image,
  # include: :category  # Do I need this? Tried it with and without
  per_page: 40)
end

更新:更正关联并在视图中使用下面的代码后,它可以工作。除了这个特定列的过滤功能。如果我输入要过滤的文本,它会重新加载 table,但不会应用过滤器(所有记录仍会显示)。

g.column name: 'Category', attribute: 'category_id', auto_reload: true, html: {id: 'grid-cells'} do |image|
  image.category.category unless image.category.nil?
end

它有很多类别,所以你应该做类似

image.categories.find(:id)

您需要为类别提供 ID,因为查询 image.categories 将 return 图像所有类别的集合数组

在图像模型中你应该有 belongs_to :category,而不是 has_one。联想是n-1,不是1-1。

关于您问题的第二部分 - 按类别名称过滤项目,我相信您需要使用自定义过滤器:

g.column name: 'Category', attribute: 'images.category_id',
      custom_filter: Category.find(:all).map{|cat| [cat.id, cat.name]} do |image|
  image.category.name if image.category
end

has_many 的另一面是 belongs_to。你需要图像模型说:

belongs_to :category

我用来记住哪个是"person and dog"的助记符:一个人has_many条狗,一条狗belongs_to一个主人。谁的衣领上有 "id_tag"?狗。所以 id 列在 belongs_to 模型上。