2010-04-06 5 views
0

Вот соответствующие модели:Можно ли управлять ассоциациями вручную?

Пользователь Продукт Заказать

Пользователь может продать или купить продукты Заказ есть покупатель, продавец и один продукт

Я знаю, что я могу сделать это с отношением HABTM между заказами и пользователем, но мне кажется, что было бы проще разместить в таблице заказа следующие столбцы:

: seller_id : buyer_id

и управлять этими отношениями вручную, поскольку заказы создаются только один раз и никогда не редактируются. Однако это не похоже на Rails-like, и мне интересно, не хватает ли я чего-то концептуально в отношениях HABTM.

ответ

2

Нет, это не рубиновый путь, хотя вы не отредактировали заказ после его создания.

Используйте следующие отношения в модели, я думаю, это сработает. Нет проверки, хотя

User.rb 
has_many :users 
has_many :purchase, :class_name =>Order, :foreign_key=>'buyer_id' 
has_many :sells, :class_name =>Order, :foreign_key=>'seller_id' 

Product.rb 
belongs_to :user 
has_many :orders 

Order.rb 
belongs_to :buyer, :class_name =>User, :foreign_key=>'buyer_id' 
belongs_to :seller, :class_name =>User, :foreign_key=>'seller_id' 
belongs_to :product 
+0

Спасибо, это имеет смысл. – sosborn

0

Для этого вам следует использовать ассоциации Rails. Ассоциация has_many - лучший выбор для вашего сценария.

class User < ActiveRecord::Base 
    has_many :buys, :class_name => "Order", :foreign_key => "buyer_id" 
    has_many :sales, :class_name => "Order", :foreign_key => "seller_id" 
end 

class Product < ActiveRecord::Base 
end 

class Order < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :buyer, :class_name => "User", :foreign_key => "buyer_id" 
    belongs_to :seller, :class_name => "User", :foreign_key => "seller_id" 
end 

Теперь вы можете использовать ассоциацию следующим образом:

current_user.buys.create(:seller => u, :product => p) 
current_user.buys 
current_user.sells 
Смежные вопросы