Asocjacja

chciałem polaczyc 2 modele User i Product z tym ze User moze miec

  • wiele sprzedanych produktow
  • wiele kupionych produktow

myslalem na tym zeby zrobic w User has_many :products i w tabeli :products dodac kolumne boolowska ktora bedzie 0 jezeli produkt kupiony i 1 ww.

Czy to dobre rozwiazanie ? sa jakies lepsze ?

możesz zrobić coś na zasadzie:

[code=ruby]Product.rb:

belongs_to :seller, class_name: “User”
belongs_to :buyer, class_name: “User”

User.rb

has_many :sold_products, class_name: “Product”, foreign_key: :seller_id
has_many :bought_products, class_name: “Product”, foreign_key: :buyer_id[/code]

[quote=Arnvald]możesz zrobić coś na zasadzie:

[code=ruby]Product.rb:

belongs_to :seller, class_name: “User”
belongs_to :buyer, class_name: “User”

User.rb

has_many :sold_products, class_name: “Product”, foreign_key: :seller_id
has_many :bought_products, class_name: “Product”, foreign_key: :buyer_id[/code]
[/quote]
tez myslalem nad tym rozwiazaniem tylko ze tu trzeba dodac 2 kolumny _id do :products
wiec zawsze jedna bedzie wisiala gratis pusta i stwierdzilem ze nie jest to dobre rozwiazanie ale moge sie mylic :slight_smile:

Zasadniczo masz relację wiele-do-wielu z ekstra informacją w modelu złączeniowym (nazwijmy go roboczo “transakcja”).
Czyli (pseudokod oraz jest ósma rano, z góry sorry za babole)

User
has_many :transactions_as_buyer, :class_name => Transaction, :foreign_key => :buyer_id
has_many :transactions_as_seller, :class_name => Transaction, :foreign_key => :seller_id
has_many :bought_products, :class_name => Product, :through => :transactions_as_buyer
has_many :sold_products, :class_name => Product, :through => :transactions_as_buyer

Transaction
belongs_to :buyer, :class_name => User
belongs_to :seller, :class_name => User
belongs_to :product

Product
has_many :transactions

+1 @Tomash
Tylko nie nazywaj modelu Transaction
http://cheat.errtheblog.com/s/rails_reserved_words/

Wiedziałem że coś spieprzę ;] Tak jak pski napisał, Transaction to bardzo zła nazwa dla tego modelu. ProductSale?