Forum: Ruby on Rails How would I model has_many and also mark one of the 'many' as special?

Posted by Walter Davis (walterdavis)
on 2013-01-16 22:11
(Received via mailing list)
I have an Image class with

 belongs_to :attachable, :polymorphic => true

Titles can have Images, and so can People. In the Person class, I have 
the apposite relationship:

 has_many :images, :as => :attachable, :dependent => :destroy
 accepts_nested_attributes_for :images, :reject_if => lambda { |a| 
a[:file].blank? && a[:file_uid].blank? && a[:file_url].blank? && 
a[:name].blank? }, :allow_destroy => true

This all works fine, I've got my forms working perfectly. Now I would 
like to mark one image as being the "portrait" for this person, and I'm 
stuck on how best to do this. I have done it in the past in what I 
recognize was a very hacky manner, just adding an image_id to the parent 
class and setting that in my controller. I'd rather go with the flow.

How would you add this to the models so that the relationship can be 
expressed in a normal nested form?

Walter
Posted by Dave Aronson (Guest)
on 2013-01-16 22:17
(Received via mailing list)
On Wed, Jan 16, 2013 at 4:09 PM, Walter Lee Davis <waltd@wdstudio.com> 
wrote:

> I would like to mark one image as being the "portrait" for this person,

I'd suggest adding that a person has_one portrait, class_name: :Image.
 In the UI you can have them select one of their Images (or none).

-Dave

--
Dave Aronson, the T. Rex of Codosaurus LLC,
secret-cleared freelance software developer
taking contracts in or near NoVa or remote.
See information at http://www.Codosaur.us/.
Posted by Walter Davis (walterdavis)
on 2013-01-16 22:24
(Received via mailing list)
On Jan 16, 2013, at 4:16 PM, Dave Aronson wrote:

> On Wed, Jan 16, 2013 at 4:09 PM, Walter Lee Davis <waltd@wdstudio.com> wrote:
>
>> I would like to mark one image as being the "portrait" for this person,
>
> I'd suggest adding that a person has_one portrait, class_name: :Image.
> In the UI you can have them select one of their Images (or none).
>
> -Dave

Does that require me to add another belongs_to to the Image? If I add a 
has_one, won't I have to balance that on the other side?

Walter
Posted by Walter Davis (walterdavis)
on 2013-01-16 22:28
(Received via mailing list)
On Jan 16, 2013, at 4:09 PM, Walter Lee Davis wrote:

>
> How would you add this to the models so that the relationship can be expressed 
in a normal nested form?
>
> Walter

I made a little dummy app to test this out in console, and got the 
following to work, but (maybe it's just me) the naming seems wrong:

class Person < ActiveRecord::Base
  attr_accessible :photo, :name
  has_many :photos, :as => :attachment, :dependent => :destroy
  belongs_to :photo
end

class Photo < ActiveRecord::Base
  attr_accessible :file_name, :name
  belongs_to :attachment, :polymorphic => true
  has_one :person
end

Ignore the fact that I called it Photo rather than Image in this one...

Photo has_one person, but there are going to be instances where the 
attachment is to a Title (which doesn't need that relationship), and I'm 
not sure what happens then.

Walter
Posted by Walter Davis (walterdavis)
on 2013-01-16 22:38
(Received via mailing list)
On Jan 16, 2013, at 4:23 PM, Walter Lee Davis wrote:

>> -Dave
>
> Does that require me to add another belongs_to to the Image? If I add a has_one, 
won't I have to balance that on the other side?
>
> Walter

Just tried this in my stunt app, and it would require me to add a 
person_id to the Photo / Image model, which since it's polymorphic, is 
sort of beside the point.

Walter
Posted by Emily S (Guest)
on 2013-01-17 17:32
(Received via mailing list)
class Person < ActiveRecord::Base
  attr_accessible :photo, :name
  has_many :photos, :as => :attachment, :dependent => :destroy

  # I would do this.  This will save a portrait_id on a person object,
which is the id of a photo.  This is most efficient because if you put 
the
"belongs_to" association on the photo object, you'll end up with many
photos with nil values for person_id.
  belongs_to :portrait, :class_name => "Photo"
end

class Photo < ActiveRecord::Base
  attr_accessible :file_name, :name
  belongs_to :attachment, :polymorphic => true
end
Posted by Walter Davis (walterdavis)
on 2013-01-17 17:35
(Received via mailing list)
On Jan 17, 2013, at 11:30 AM, Emily S wrote:

>   belongs_to :attachment, :polymorphic => true
Thanks for the suggestion. Would I also need to add anything to the 
Photo class to hold up the other side of the belongs_to? has_one 
:person, maybe? Or would it work without that?

Walter
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.