extra field as attribute in join table with has_many :through

hi everyone, I've pasted some code over there http://pastie.org/230343 .

what I find strange is that the extra field in the join table called "quantity" doesn't shows up in the Drug resultset, even if I added an attr_accessor for good measure.

anybody knows why? I'm on edge rails.

thanks.

hi everyone, I've pasted some code over therehttp://pastie.org/230343.

what I find strange is that the extra field in the join table called "quantity" doesn't shows up in the Drug resultset, even if I added an attr_accessor for good measure.

The attr_accessor would actually squash the attribute if it were there. It's normal not to get the join table attributes - that's just the way rails does things. Your workaround with the explicit select clause should work, I expect that you are being fooled by ActiveRecord's display of your instance of Drug, which only displays attributes from the drugs.table. Document.find(2).drugs.first.quantity should work (but get rid of the attr_accessor first).

Fred

Frederick Cheung wrote:

hi everyone, I've pasted some code over therehttp://pastie.org/230343.

what I find strange is that the extra field in the join table called "quantity" doesn't shows up in the Drug resultset, even if I added an attr_accessor for good measure.

The attr_accessor would actually squash the attribute if it were there. It's normal not to get the join table attributes - that's just the way rails does things. Your workaround with the explicit select clause should work, I expect that you are being fooled by ActiveRecord's display of your instance of Drug, which only displays attributes from the drugs.table. Document.find(2).drugs.first.quantity should work (but get rid of the attr_accessor first).

Fred

One way to guarantee the method exists, and allow you to cast it to an integer would be;

class Drug < ActiveRecord::Base   def quantity     self[:quantity].to_i   end end

But I don't like it, because "quantity" isn't actually a value of of the Drug, it's a value of the join.

clearly; drug = document.drugs.first drug.quantity != drug.reload.quantity (which will always be 0)

I'd prefer the following syntax;

drug = documents.drugs.first quantity = documents.quantity_of_drug(drug)

class Document < ActiveRecord::Base   def quantity_of_drug(drug)     if join = join_for_drug(drug)       return join.quantity     else       return 0     end   end

  private

  def join_for_drug(drug)     self.document_drugs.detect {|dd| dd.drug == drug}   end end

however you'd need to ensure you loaded drugs through document_drugs, rather than by a direct join (not quite sure what rails does about this at the moment)

thanks for the suggestions, I'm going to do a bit of work on that as advertised.