Hey Liz and Marco, thanks a lot for your inputs.

I´ll provide a few more details from what I already have and some needs:

   - A Party is an Organization or a Person. *One of the parties is also
   defined as the "proprietary party". It´s the organization actually running
   the app.*
   - A Party have many relationships with other parties and there are many
   relationthip types: supplier, customer, employee, reseller, etc.
      - "John is *employee* at ACME CORP"
      - "Mary is *employee* at ACME CORP"
      - "ACME-CA is *reseller* from ACME CORP"
      - "XYZ is *customer* from ACME CORP"
      - PWL is *customer* from ACME CORP"

What I already have:


   - A STI based model, where a Party have the types: Organization and
   Person:

*Party*


   -

   class Party < ActiveRecord::Base
      has_many :party_relationships
      has_many :second_parties, :through => :party_relationships
      scope :organizations, -> { where(type: 'Organization') }
      scope :people, -> { where(type: 'Person') }

       def self.types
         %w(Organization Person)
       endend

   *Organization*

   class Organization < Partyend

   *Person*

   class Person < Partyend




   - A Party Relationship Model:

*PartRelationship*


   -

   class PartyRelationship < ActiveRecord::Base
     belongs_to :party, :class_name=>'Party'
     belongs_to :second_party, :class_name => 'Party'
     enum relation: [ :customer, :supplier, :employee, :reseller ]end




   - I currently have on PartyController who deals with both party
   subtypes. What I need is just a "shorcut" to the crud model.
   - I ended up using these routes below, pointing to the same party
   controller and dealing with some conditions based on params[:relation]
   inside controller to know what to do:

*    resources :customers, controller: 'parties', relation: 'customer'*
*    resources :suppliers, controller: 'parties', relation: 'supplier'*




2015-08-23 18:44 GMT-03:00 Elizabeth McGurty <emcgur...@gmail.com>:

> Sorry, Leandro, but I do not agree with you.  However I may not understand
> what you have offered.  Just seems to me that the solution is
> model-drive.   Where in the Party and PartyRelationship controller aspects
> of CRUD can be managed in building respective association calls.  Like <<
> to create, .destroy to delete, etc..   Maybe at a maintenance level
> Role/Customer and CustomerType/Supplier Controllers would be appropriate
>
> (Forgive I am writing quickly)
>
> I would suggest a model structure like the following:
>
> class Party < ActiveRecord::Base
>     has_many :party_relationships
>     has_many :roles
> end
>
> class Role < ActiveRecord::Base
>   belongs_to :party_relationship
> end
>
> class CustomerType < ActiveRecord::Base
>   belongs_to :party_relationship
> end
>
> class PartyRelationship < ActiveRecord::Base
>   belongs_to :party
>    ##  customer, supplier, reseller
>   scope :customer, -> { where(customer_type_id: 1) }   ## id values are
> specific as to new table/record creation and to my seed below
>   scope :supplier, -> { where(customer_type_id: 2) }
>   scope :reseller, -> { where(customer_type_id: 3) }
>   has_many :customer_types
> end
>
> Offering seed.rb
>
> ##  Assuming you are starting anew
>
> unless Party.count > 0
> Party.create!(name: 'Person#1', role_id: 2 )  ## id: 1
> Party.create!(name: 'Person#2', role_id: 2 )  ## id: 2
> Party.create!(name: 'Vendor#1', role_id: 3 )  ## id: 3
> Party.create!(name: 'Vendor#2', role_id: 3 )  ## id: 4
> Party.create!(name: 'Company#1', role_id: 1 )  ## id: 5
> Party.create!(name: 'Company#2', role_id: 1 )  ## id: 6
> end
>
> unless PartyRelationship.count > 0
> PartyRelationship.create!(party_id: 1, customer_type_id: 1 )  ## Person 1
> is an Person that is a customer
> PartyRelationship.create!(party_id: 2, customer_type_id: 2 )  ## Person 2
> is an Person that is a supplier
> PartyRelationship.create!(party_id: 3, customer_type_id: 3 )  ## Vendor 1
> is an Companu that is a reseller
> PartyRelationship.create!(party_id: 4, customer_type_id: 1 )  ## Vendor 2
> is an company that is a customer
> PartyRelationship.create!(party_id: 5, customer_type_id: 2 )  ## Company 1
> is an organization that is a supplier
> PartyRelationship.create!(party_id: 6, customer_type_id: 3 )  ## Company 2
> is an organization that is a reselller
> end
>
> PartyRelationship.create!(party_id: 1, customer_type_id: 2 )  ## Person 1
> is an Person that is a supplier
>
> unless Role.count > 0
> Role.create!(role_name: 'Organization')
> Role.create!(role_name: 'Person')
> Role.create!(role_name: 'Company')
> end
>
> unless CustomerType.count > 0
> CustomerType.create!(name: 'customer')
> CustomerType.create!(name: 'supplier')
> CustomerType.create!(name: 'reseller')
> end
>
> And migration:
>
>   create_table "parties", force: :cascade do |t|
>     t.integer  "role_id",    limit: 4
>     t.string   "name",       limit: 255
>     t.datetime "created_at",             null: false
>     t.datetime "updated_at",             null: false
>   end
>
>   create_table "party_relationships", force: :cascade do |t|
>     t.integer  "party_id",         limit: 4
>     t.integer  "customer_type_id", limit: 4
>     t.datetime "created_at",                 null: false
>     t.datetime "updated_at",                 null: false
>   end
>
>   create_table "roles", force: :cascade do |t|
>     t.string   "role_name",  limit: 255
>     t.datetime "created_at",             null: false
>     t.datetime "updated_at",             null: false
>   end
>
>   create_table "customer_types", force: :cascade do |t|
>     t.string   "name",       limit: 255
>     t.datetime "created_at",             null: false
>     t.datetime "updated_at",             null: false
>   end
>
> Then you should be able to make association calls like
>
> Party.find(1).party_relationships.customer
>
> There may be many errors here, but the spirit is that one can perform CRUD
> given the Party and PartyRelationship model through their respective
> controllers..... FORGIVE me if I am wrong.
>
> Liz
>
>
>
>
>
>
> On Sunday, August 23, 2015 at 4:40:25 PM UTC-4, Marco Antonio Almeida
> wrote:
>>
>> Hi Leandro,
>>
>> I would go for two controllers here. A CustomersController and a
>> SuppliersController. You would just need to handle the Party model
>> appropriately in each one of those controllers.
>>
>> Best regards,
>> // Marco
>>
>> On Sat, Aug 22, 2015 at 10:59 PM Leandro França <leandroay...@gmail.com>
>> wrote:
>>
>>> Hi there everyone,
>>>
>>> I have a tradicional "Party/Role Model" in my app:
>>>
>>>      - *Party*  ( an organization, a person, etc)
>>>      - *PartyRelationship* ( One or more relationships between parties.
>>> They can have relationship types: *customer*, *supplier*, *reseller*,
>>> etc)
>>>
>>> However, I need to create two "shorcuts" :
>>>    -  one to customers CRUD  and
>>>    -  one to suppliers CRUD , *even if they´re actually both "parties"
>>> behind the scenes*.
>>>
>>> I´d like to show on my navigation menu:
>>>
>>> 1) A "Customers" link routing to the customer crud.  (Actually, the
>>> party CRUD, knowing ahead it would be dealing with a "customer" party
>>> relationship)
>>> 2) A "Supplier" link routing to the supplier crud. (Actually, the same
>>> party CRUD, knowing ahead it would be dealing with a "customer" party
>>> relationship)
>>>
>>> These links will also need to filter the parties being listed, based on
>>> their relationship types.
>>>
>>> What´s the recommended approach to this?
>>>
>>> Thanks in advance!
>>>
>>> Regard.
>>> Leandro
>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Ruby on Rails: Talk" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to rubyonrails-ta...@googlegroups.com.
>>> To post to this group, send email to rubyonra...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/rubyonrails-talk/8d2660cd-1d4a-47b7-9425-c903c56a4bf6%40googlegroups.com
>>> <https://groups.google.com/d/msgid/rubyonrails-talk/8d2660cd-1d4a-47b7-9425-c903c56a4bf6%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to rubyonrails-talk+unsubscr...@googlegroups.com.
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/rubyonrails-talk/5f60d14d-3181-4ed5-a047-ab325e6c601d%40googlegroups.com
> <https://groups.google.com/d/msgid/rubyonrails-talk/5f60d14d-3181-4ed5-a047-ab325e6c601d%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/CAAt6bOohMwm-pfG8pK_ktsw1gYjmeAHoYVAGRB9fE6CVQOJENg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to