我想为Products
种子并将其分配到特定的User
和Store
。
Product.rb
class Product < ActiveRecord::Base
belongs_to :user
belongs_to :store
def product_store=(id)
self.store_id = id
end
end
注意:Store
belongs_to Business
(:business_name
)
Seed.rb
这是我的基本设置:
user = User.create(:username => 'user', :email => 'user2@email.com')
store = Store.create(:business_name => 'store', :address => 'Japan')
我尝试了这些,但它们不起作用:
# This gives random ID's ranging from 1 to 4425!?
user.products.create([{:name => "Apple", :product_store => Store.find_by_address('San Francisco, USA')}])
# This gives me undefined method 'walmart'.
user.store.products.create([ {:name => "Apple"} ])
有没有办法设置ID,以便我可以将Products
与Store
和User
相关联?
更新 -
我已经尝试了下面的答案,但仍然没有成功。有没有人知道另一种方法呢?
答案 0 :(得分:8)
虽然听起来你找到了解决方法,但解决方案可能对其他人感兴趣。
来自您原来的种子.rb
user = User.create(:username => 'user', :email => 'user2@email.com')
store = Store.create(:business_name => 'store', :address => 'Japan')
创建商店
Store.create({
user_id: user.id
store_id: store.id
}, without_protection: true)
在原始代码中,声明了“user”和“store”变量。代码将user_id / store_id(由Store模型中的belongs_to关系推断的模型列)分配给“user”和“store”变量中存在的id值。
“without_protection:true”关闭id字段的批量分配保护。这在种子文件中是完全可以接受的,但在处理用户提供的数据时应该非常谨慎使用。
答案 1 :(得分:2)
如果我没弄错的话,你只是想这样做。
user = User.create(:username => 'usertwo', :email => 'user2@email.com')
walmart = Store.create(:business_name => 'Walmart', :address => 'San Francisco, USA')
user.products.create(:name => 'Apple', :store => walmart)
我在这里需要的其他任何东西都没有看到?
答案 2 :(得分:1)
尝试这样做
store_1 = Store.new(:business_name => 'Test Store',
:address => 'Test Address',
:phone_number => '555-555-555')
store_1.id = 1
store_1.save!
诀窍是不要在哈希中设置id,因为它受到保护。
斯科特
答案 3 :(得分:1)
我所做的是将特定产品更新为某个用户,请参阅此问题:
Can I update all of my products to a specific user when seeding?
答案 4 :(得分:0)
您可以为此&#34;种子迁移&#34;创建一系列插入声明,包括每个用户,商店,产品等的记录ID。您可能必须在此方法后更新数据库序列。
另一种方法 通过GUI / web在您的Rails应用程序中创建初始记录。 然后使用像Yaml-db这样的东西。因此,您可以将数据转储到yaml文件。您现在可以编辑该文件(如果需要)并使用相同的文件为数据库的另一个实例设置种子&#34; rake db:load&#34;
无论哪种方式....你知道当在新的数据库实例中创建这些对象时,ID不会转移到你身上。
我确定还有其他方法可以做到这一点......甚至可能是更好的方法。 这是一篇关于使用yaml_db为oracle数据库播种的一段时间的写作链接 http://davidbharrison.com/database_seeding_oracle
答案 5 :(得分:0)
试试这个:
User.destroy_all
Product.destroy_all
user = User.create!([{:username => 'usertwo', :email =>'user2@email.com'},
{:username => 'userthree', :email => user3@email.com}])
user.each_with_index do |obj, index|
Product.create!([{ :product_name => 'product #{index}', :user_id => obj.id }])
end
表格如下所示:
答案 6 :(得分:0)
这是我更喜欢在 Rails 6 中建立关联的方式
@teacher = Teacher.new(name: "John")
@student = @teacher.build_student(name: "Chris")
@teacher.save!
@student.save!