I have a many-to-many where the order matters on one side, and the
draggable reordering that the Agility tutorial uses would be great to use -
however it doesn't seem to be as easy as the one-to-many example in the
tutorial.
I have my objects and relationships set up as:
class Destination < ActiveRecord::Base
hobo_model # Don't put anything above this
fields do
name :string
timestamps
end
attr_accessible :name, :alterations
has_many :alteration_assignments, :dependent => :destroy
has_many :alterations, :through => :alteration_assignments, :accessible
=> true, :dependent => :destroy, :order => "position"
children :alterations
class Alteration < ActiveRecord::Base
hobo_model # Don't put anything above this
fields do
name :string
script :string
timestamps
end
attr_accessible :name, :script
has_many :alteration_assignments, :dependent => :destroy
has_many :destinations, :through => :alteration_assignments
class AlterationAssignment < ActiveRecord::Base
hobo_model # Don't put anything above this
fields do
timestamps
end
attr_accessible
belongs_to :destination
belongs_to :alteration
acts_as_list :scope => :destination
It works great - alterations are added, and the position field is set
properly when adding an alteration, except the draggable list doesn't
render - the normal alteration cards show up under show destination, and
the normal alteration select/add/remove shows up under edit destination.
I'm assuming the problem has to do with the acts_as_list only being on the
assignment object and not the actual alteration object:
irb(main):004:0> destination.alterations.first.move_to_bottom
Alteration Load (19.1ms) SELECT "alterations".* FROM "alterations" INNER
JOIN "alteration_assignments" ON "alterations"."id" =
"alteration_assignments"."alteration_id" WHERE
"alteration_assignments"."destination_id" = 4 ORDER BY position LIMIT 1
NoMethodError: undefined method `move_to_bottom' for #<Alteration:0xaa229e8>
irb(main):006:0> destination.alteration_assignments.first.move_to_bottom
AlterationAssignment Load (1.0ms) SELECT "alteration_assignments".* FROM
"alteration_assignments" WHERE "alteration_assignments"."destination_id" =
4 LIMIT 1
(0.6ms) BEGIN
SQL (0.9ms) UPDATE "alteration_assignments" SET position = (position -
1) WHERE ("alteration_assignments"."destination_id" = 4 AND position > 1)
AlterationAssignment Load (1.1ms) SELECT "alteration_assignments".* FROM
"alteration_assignments" WHERE ("alteration_assignments"."destination_id" =
4 AND id != 4) ORDER BY alteration_assignments.position DESC LIMIT 1
(0.8ms) UPDATE "alteration_assignments" SET "position" = 2,
"updated_at" = '2012-12-12 19:36:58.007222' WHERE
"alteration_assignments"."id" = 4
(0.9ms) SELECT COUNT(*) FROM "alteration_assignments" WHERE
("alteration_assignments"."destination_id" = 4 AND position = 2)
(55.0ms) COMMIT
=> true
Is there a way to get Hobo to deal with this automagically like with
one-to-many, or do I need to write something myself?
--
You received this message because you are subscribed to the Google Groups "Hobo
Users" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/hobousers/-/rBbimvP3HzcJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/hobousers?hl=en.