gpt4 book ai didi

ruby-on-rails - has_and_belongs_to_many 关联表名

转载 作者:行者123 更新时间:2023-12-01 22:51:31 25 4
gpt4 key购买 nike

我试图弄清楚 rails 是如何决定命名一个表的。我不得不反复试验才能弄清楚。

该表最终被命名为 menu_categories_items .我想知道它是如何做到的。

楷模

# == Schema Information
#
# Table name: menu_categories
#
# id :integer not null, primary key
# name :string(255)
# order :integer
# image_url :string(255)
# parent_category_id :integer
# created_at :datetime
# updated_at :datetime
#

class MenuCategory < ActiveRecord::Base
belongs_to :parent_category, class_name: "MenuCategory"
has_and_belongs_to_many :menu_items
end

# == Schema Information
#
# Table name: menu_items
#
# id :integer not null, primary key
# name :string(255)
# description :text
# price :decimal(, )
# order :integer
# created_at :datetime
# updated_at :datetime
#

class MenuItem < ActiveRecord::Base
has_and_belongs_to_many :menu_categories
end

移民
class CreateMenuCategoriesAndMenuItems < ActiveRecord::Migration
def change
create_table :menu_categories do |t|
t.string :name
t.integer :order
t.string :image_url
t.references :parent_category, index: true

t.timestamps
end

create_table :menu_items do |t|
t.string :name
t.text :description
t.decimal :price
t.integer :order

t.timestamps
end

create_table :menu_categories_items, id: false do |t|
t.belongs_to :menu_category
t.belongs_to :menu_item
end
end
end

最佳答案

HABTM
has_and_belongs_to_many关联表通常具有 [plural_first_alphabetical_model]_[plural_second_alphabetical_model] 的命名约定带有任何共享命名前缀

虽然这是 Rails 标准,但您可以使用 join_table 将名称更改为您自己的名称。争论:

#app/models/item.rb
class Item < ActiveRecord::Base
has_and_belongs_to_many :categories, join_table: "test"
end

#app/models/category.rb
class Category < ActiveRecord::Base
has_and_belongs_to_many :items, join_table: "test"
end

您可以 see how this works here :

If you create a has_and_belongs_to_many association, you need to explicitly create the joining table. Unless the name of the join table is explicitly specified by using the :join_tableoption, Active Record creates the name by using the lexical order of the class names. So a join between customer and order models will give the default join table name of "customers_orders" because "c" outranks "o" in lexical ordering.



--

has_many:通过
has_many :through表通常称为 [alphabetical_model_name_singular]_[alphabetical_model_name_plural]
has_many :through 的区别是因为有一个 model在此关联的背后,您需要了解您的表将绑定(bind)到 model本身;这意味着您实际上可以根据需要/需要调用连接表

推荐

我实际上建议您从模型中删除“菜单”,当然,除非它们是更广泛数据的一部分。

您遇到的问题是您将不得不调用 menu_每次您希望调用关联或数据时:
@item = MenuItem.find 1
@item.menu_categories

这太冗长了。你会更好地保持你的代码干燥,允许你用它们的“自然”名称来调用特定的对象:
#app/models/item.rb
Class Item < ActiveRecord::Base
has_and_belongs_to_many :categories
end

#app/models/category.rb
Class Category < ActiveRecord::Base
has_and_belongs_to_many :items
end

默认情况下,您的 HABTM 表将为 categories_items ,允许您调用以下命令:
@item = Item.find 1
@item.categories

--

面向对象

你必须记住 Ruby/Rails 是 object orientated ,这意味着每次您在应用程序中创建任何功能时,您基本上都必须围绕应用程序中的对象制作它

在这里不做太多细节,让我解释一下你遇到的主要问题之一是你基本上是在逃避面向对象的过程,通过调用你的对象 menu_xmenu_y .您需要通过对象的“普通”名称来调用对象 - 一个描述它们是什么的简单名称,如果需要将它们与另一个模块相关联。

面向对象开发的目标是执行以下操作:
@item = Item.find 1
@item.switch_menus 2
@item.reload!

看看这有多“人性化”? OOP 开发需要围绕对象制作经验——允许您根据需要操作和更改对象

关于ruby-on-rails - has_and_belongs_to_many 关联表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com