Forum: Ruby Can I save relationship using hasmanythrough

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
145e373624d173d2226a3dec4c563dfe?d=identicon&s=25 jack.tang (Guest)
on 2007-04-06 04:56
(Received via mailing list)
Hi

In the classic hasmanythrough example:

class Group < ActiveRecord::Base
        has_many :memberships
        has_many :users, :through => :memberships
end

class User < ActiveRecord::Base
        has_many :memberships
        has_many :groups, :through => :memberships
end

group1 = Group.new(.....)
group1.users = [User.find_by_id(2)]
group1.save!

it throws the exception: "users=" is one undefined method. So how can
i save the relationship in hasmanythrough?
47b1910084592eb77a032bc7d8d1a84e?d=identicon&s=25 Joel VanderWerf (Guest)
on 2007-04-06 05:55
(Received via mailing list)
jack.tang wrote:
>         has_many :memberships
>         has_many :groups, :through => :memberships
> end
>
> group1 = Group.new(.....)
> group1.users = [User.find_by_id(2)]
> group1.save!
>
> it throws the exception: "users=" is one undefined method. So how can
> i save the relationship in hasmanythrough?
>

To save your relationship you might try

(a) flowers

(b) therapy

(c) the rails list
145e373624d173d2226a3dec4c563dfe?d=identicon&s=25 jack.tang (Guest)
on 2007-04-06 10:05
(Received via mailing list)
On Apr 6, 10:52 am, "jack.tang" <him...@gmail.com> wrote:
>         has_many :memberships
>         has_many :groups, :through => :memberships
> end
>
> group1 = Group.new(.....)
> group1.users = [User.find_by_id(2)]
> group1.save!
>
> it throws the exception: "users=" is one undefined method. So how can
> i save the relationship in hasmanythrough?

Hi Guys.

here is another question -- how can I load asscocitated class while
fetching. say
User.find_by_name("test").groups

The error is "NameError: uninitialized constant User::Groups" , my
rails version is 1.2.3.
Can you tell me how to enable :through function?

/Jack
8f6f95c4bd64d5f10dfddfdcd03c19d6?d=identicon&s=25 Rick Denatale (rdenatale)
on 2007-04-07 18:28
(Received via mailing list)
On 4/5/07, jack.tang <himars@gmail.com> wrote:
>         has_many :memberships
>         has_many :groups, :through => :memberships
> end

Where's your Membership model?  I think you need something like:

   class Membership < ActiveRecord::Base
           belongs_to :group
           belongs_to :user
    end

> group1 = Group.new(.....)
> group1.users = [User.find_by_id(2)]
> group1.save!


>
> it throws the exception: "users=" is one undefined method. So how can
> i save the relationship in hasmanythrough?

This has nothing to do with the :through option.  The :has_many
relationship doesn't add a setter.  Instead you need to use methods on
the attribute, which is not a normal ruby array but an ActiveRecord
object which looks like an Array but is doing the right SQL magic
under the covers.

Some useful methods include:
    group1.users<< user # add a user
    group1.users.push(user1, user2, ...) add one or more users
    group1.users.replace(user1, ...) replace users with one or more
users
    group1.users.delete(user1, ...) delete one or more users.


If you want to create a :has_many:through: relationship using just the
two ends, both far ends of the association need to exist on the
database:

group1 = Group.create(...)  # group needs to have been previously saved
                                             # ... represents
attributes to be set in the group
group1.users << User.find_by_id(2)

Or to create a new user and add it to the group:

group1 = Group.create(...)
article.users.create!(...)

If you want to have attributes in the membership if you don't why are
you using has_many:through:?   Then you need to create the
intermediate table yourself.  So lets' say the membership is used to
hold things like when it expires:

membership = Membership.new
membership.expiration = Time.now.next_year.to_date
membership.group = Group.find_by_id(3) # or how ever you get the group
membership.user = User.find_by_username("Dirk Gently")
membership.save

You'll probably get more help with ActiveRecord questions on more
rails specific resources:
http://www.rubyonrails.org/community

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/
This topic is locked and can not be replied to.