Rails与模型和迁移的关联

22 浏览
0 Comments

Rails与模型和迁移的关联

不明白Rails模型与关联是如何工作的。这是一个简单的问题:

有两个表

产品

id| 名称 | 状态

1 | 管 | 0

2 | 支柱 | 1

3 | 书 | 0

4 | 口香糖 | 1

5 | 杯子 | 2

状态

状态 | 名称
0      | 不可用
1      | 有库存
2      | 打折

模型和控制器的名称几乎相同。

我不想在每个新产品上创建statuses表中的新行。我希望在erb中显示状态名称。我应该在模型和迁移文件中写什么(例如,属于,拥有一个还是拥有多个...)?

0
0 Comments

Rails关联模型和迁移的问题出现的原因是需要在数据库中建立表之间的关系,以便能够根据外键来检索相关的数据行。解决这个问题的方法是创建一个新的列,在相应的表中加入外键。

首先,在statuses表中添加一个名为product_id的新列,可以使用以下命令生成迁移文件:

rails g migration AddProductIdToStatuses product_id:integer

完成后,需要在product.rb文件中添加以下代码:

has_many :statuses

然后,在status.rb文件中添加以下代码:

belongs_to :product

或者,可以使用以下链接中提到的方法添加引用:stackoverflow.com/a/16354779/2197555

0
0 Comments

Rails association with models and migration

在Rails中,模型和迁移之间的关联问题

问题的出现原因:

在Rails中,根据惯例,需要将product.status重命名为product.status_id。这是因为在Rails中,关联模型的外键字段名通常会在原字段名的基础上加上"_id"后缀。在这个问题中,product模型与status模型之间存在关联关系,而status模型具有多个与之关联的product模型。

解决方法:

为了解决这个问题,首先需要在product模型中添加关联声明,即product belongs_to :status。这样,product模型就会与status模型建立起一对一的关联关系。

接下来,在status模型中添加关联声明,即status has_many :products。这样,status模型就会与product模型建立起一对多的关联关系。

最后,通过调用Product.find(1).status.name,可以获取到id为1的product模型所对应的status模型的name属性值,该属性值应为'Unavailable'。

以下是代码示例:

class Product < ApplicationRecord
  belongs_to :status
end
class Status < ApplicationRecord
  has_many :products
end
product = Product.find(1)
puts product.status.name  # 输出 'Unavailable'

通过按照以上步骤进行关联声明和调用,就可以正确地获取到product模型与status模型之间的关联信息,并获取到相应的属性值。

0
0 Comments

Rails里的模型关联和迁移有关。

如果需要一个简单的一对多关联,Product模型应该有一个belongs_to关联到Status模型,而Status模型应该有一个has_many关联到Product模型。在erb文件中,你可以使用<%= .status.name %>来获取状态的名称。为了设置这些迁移,你需要创建两个表,一个是products表,包含name和status_id两个字段,另一个是statuses表,只包含name字段。

解决方法是在两个模型的文件中添加关联代码,并在迁移文件中创建对应的表。具体代码如下:

# app/models/product.rb
class Product < ApplicationRecord
  belongs_to :status
end
# app/models/status.rb
class Status < ApplicationRecord
  has_many :products
end
# db/migrate/xxxx_create_products.rb
class CreateProducts < ActiveRecord::Migration[6.0]
  def change
    create_table :products do |t|
      t.string :name
      t.integer :status_id
    end
  end
end
# db/migrate/xxxx_create_statuses.rb
class CreateStatuses < ActiveRecord::Migration[6.0]
  def change
    create_table :statuses do |t|
      t.string :name
    end
  end
end

更多信息可以在这里找到:点击这里查看

0