模型

时间:2017-03-14 11:58:02

标签: ruby-on-rails ruby-on-rails-4

因此,我为项目的一部分设置了命名空间。

class Namespace::Product < ActiveRecord::Base
  belongs_to: :namespace_category, class_name: 'Namespace::Category'
  ...
end

class Namespace::Category < ActiveRecord::Base
  has_many :products, :class_name => 'Namespace::Product'
  ...
end

Product的迁移看起来像

create_table :namespace_products do |t|
  t.belongs_to :namespace_category, index: true
  ...
end

所以,当我这样做时

p = Namespace::Product.create(some_params)
c = Namespace::Category.find(id)
c.products << p

它引发了一个错误,说ActiveModel::MissingAttributeError: can't write unknown attribute 'category_id',但我有一个属性

t.integer  "namespace_category_id"

在我的schema.rb中,这是由迁移创建的。

3 个答案:

答案 0 :(得分:0)

好的,我只需要在foreign_key中定义has_many :products关联时指定Namespace::Category,感谢Max

答案 1 :(得分:0)

我只会从关联中省略命名空间:

<link rel="icon" type="image/png" href=favicon.ico>
class Namespace::Product < ActiveRecord::Base
  belongs_to :category, class_name: 'Namespace::Category'
  ...
end

class Namespace::Category < ActiveRecord::Base
  has_many :products, class_name: 'Namespace::Product'
  ...
end

答案 2 :(得分:0)

对于Rails 5+上的所有人,如果您不希望它们出现在关联中,也可以在迁移级别指定名称空间:

def change
  create_table :namespace_products do |t|
    t.references :category, foreign_key: { to_table: :namespace_categories }
  end
end

# or

def change
  add_reference :namespace_products, :category, foreign_key: { to_table: :namespace_categories }
end
class Namespace::Product < ActiveRecord::Base
  belongs_to :category
end

class Namespace::Category < ActiveRecord::Base
  has_many :products
end

https://api.rubyonrails.org/v5.0.0/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference