Did rails or shoulda go insane on the inflection of 'taxes'?

I have a model ‘xp_jurisdiction_taxes’ which rails (3) created
correctly.

Another model ‘xp_jurisdiction_states’ has many :xp_jurisdiction_taxes.

In my spec I am using a shoulda helper to test the association but get
the
following error. BTW, greped the whole project just in case and the
string
‘taxi’ exists nowhere.

  1. XpJurisdictionStates
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant XpJurisdictionStates::XpJurisdictionTaxis

    ./spec/models/xp_jurisdiction_states_spec.rb:4:in `block (2

levels)
in <top (required)>’

Not sure if this is a rails or shoulda issue (I am starting to think it
is
shoulda). Any input?

Correction — I had originally misnamed the models by plural, however
once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the
console.

On 2 March 2011 00:15, David K. [email protected] wrote:

Correction — I had originally misnamed the models by plural, however once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the console.

Can you confirm the model, association and table names please?

Colin

On 2 March 2011 15:08, David K. [email protected] wrote:

class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states

that should be :xp_jurisdiction_state. It belongs to one state so
singular.

public | xp_jurisdiction_taxes | table | postgres
public | xp_jurisdiction_taxes_id_seq | sequence | postgres

  1. AccountSubcode
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant AccountSubcode::XpJurisdictionTaxis

If you run a console and type
“tax”.pluralize you will get “taxes” which is correct. However on
rails 3.0.5 if I type “taxes”.singularize I get taxis which is not
what you want. I assume it is using the same rule as would apply for
axis and axes. The solution is to specify your own rules for your
xp_jurisidiction_tax and taxes and then you should be ok.

  1. XpJurisdictionTax
    Failure/Error: it { should belong_to(:xp_jurisdiction_states) }

Again should be singular, so that explains that problem I think.

Colin

On Wed, Mar 2, 2011 at 3:44 AM, Colin L. [email protected]
wrote:

On 2 March 2011 00:15, David K. [email protected] wrote:

Correction — I had originally misnamed the models by plural, however
once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the
console.

Can you confirm the model, association and table names please?

Thanks Colin, here are the models and tables. Also to be sure went in to
db
console and verified the actual table names just in case something went
awry. Also at bottom are the three rspec/shoulda errors. I have to be
doing
something wrong but if I am I don’t see it.

class XpJurisdictionState < ActiveRecord::Base
has_many :xp_jurisdiction_taxes
end

class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states
end

create_table “xp_jurisdiction_states”, :force => true do |t|
t.string “state_code”
t.string “state”
t.string “billing_item”
t.string “billing_memo”
t.datetime “created_at”
t.datetime “updated_at”
end

create_table “xp_jurisdiction_taxes”, :force => true do |t|
t.integer “xp_jurisdiction_state_id”
t.integer “account_subcode_id”
t.decimal “tax”
t.datetime “created_at”
t.datetime “updated_at”
end

public | xp_jurisdiction_states | table | postgres
public | xp_jurisdiction_states_id_seq | sequence | postgres
public | xp_jurisdiction_taxes | table | postgres
public | xp_jurisdiction_taxes_id_seq | sequence | postgres

  1. AccountSubcode
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant AccountSubcode::XpJurisdictionTaxis

    ./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in

<top
(required)>’

  1. XpJurisdictionState
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant XpJurisdictionState::XpJurisdictionTaxis

    ./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2

levels) in
<top (required)>’

  1. XpJurisdictionTax
    Failure/Error: it { should belong_to(:xp_jurisdiction_states) }
    Expected XpJurisdictionTax to have a belongs_to association
    called
    xp_jurisdiction_states (XpJurisdictionTax does not have a
    xp_jurisdiction_states_id foreign key.)

It looks like a plain old AR inflection error; you can see it in the
console:

“tax”.pluralize
=> “taxes”
“taxes”.singularize
=> “taxis”

Rails stopped accepting inflection-related patches ages ago, but you can
add
more; google “adding activerecord inflections”. The rails docs have a
few
examples in the table_name method documentation:

Phil

On 2 March 2011 17:54, David K. [email protected] wrote:


BUT some piece of code is still deciding that I have ‘taxis’ and not
‘taxes’ — spec still failing:

  1. AccountSubcode
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant AccountSubcode::XpJurisdictionTaxis

./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in <top

(required)>’

It seems as if shoulda is not picking up the inflections for some
reason. I don’t use shoulda, can you output debug during its
execution? Is so what happens if you output
“xp_jurisdiction_taxes”.singularize and “taxes”.singularize?

  1. XpJurisdictionState
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant XpJurisdictionState::XpJurisdictionTaxis

./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2 levels) in

<top (required)>’

So… all the important tests are failing but not my shoulda checks on my

I presume you meant passing rather than failing :slight_smile:

Colin

On Wed, Mar 2, 2011 at 1:46 PM, Colin L. [email protected]
wrote:

<top

(required)>’

It seems as if shoulda is not picking up the inflections for some
reason. I don’t use shoulda, can you output debug during its
execution? Is so what happens if you output
“xp_jurisdiction_taxes”.singularize and “taxes”.singularize?

Good question… and rails gets it right:

ruby-1.9.2-p136 :004 > ‘xp_jurisdiction_taxes’.singularize
=> “xp_jurisdiction_tax”

When I have a chance will start looking at the shoulda source…

I presume you meant passing rather than failing :slight_smile:

Oh, yeah… everything else is working

On 2 March 2011 20:18, David K. [email protected] wrote:

=> “xp_jurisdiction_tax”
I meant to output that during the test itself if possible, to make
sure that the inflections have been picked up at that time.

Colin

On Wed, Mar 2, 2011 at 9:41 AM, Colin L. [email protected]
wrote:

has_many :xp_jurisdiction_taxes
end

class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states

that should be :xp_jurisdiction_state. It belongs to one state so
singular.

Thanks (both Colin and Phil), fixed this above (duh). Also added to my
inflections:

inflect.singular ‘taxes’, ‘tax’

So in the console:

ruby-1.9.2-p136 :002 > ‘taxes’.singularize
=> “tax”

and also plural:
ruby-1.9.2-p136 :003 > ‘tax’.pluralize
=> “taxes”

BUT some piece of code is still deciding that I have ‘taxis’ and not
‘taxes’ — spec still failing:

  1. AccountSubcode
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant AccountSubcode::XpJurisdictionTaxis

    ./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in

<top
(required)>’

  1. XpJurisdictionState
    Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
    NameError:
    uninitialized constant XpJurisdictionState::XpJurisdictionTaxis

    ./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2

levels) in
<top (required)>’

So… all the important tests are failing but not my shoulda checks on
my
model relations. I can just drop these lines in my tests and be ok as
other
code is essentially checking these via its actions, but is leaving a
mystery
still open as to why. It seems to me that shoulda is doing something
funky
in determining what it expects, which on the surface seems strange (I
mean,
if I say the relation should be :xp_jurisdiction_taxes… there is
nothing
to infer… that symbol is the same in the shoulda/rspec and in the
class it
is testing…

Anyhow, if you all have any other input, appreciated. Seems to me next
step
will be to see if I can trace this through the shoulda source code,
although
not really in a place timewise right now…

On 2 March 2011 22:40, David K. [email protected] wrote:


Good idea, sorry… so “puts ‘xp_jurisdiction_taxes’.singularize” while
inside a spec (cant put it directly inside the shoulda call though) gives
us:

xp_jurisdiction_tax

In that case it looks as if you are right about it being a shoulda
issue, not using the inflections correctly.

Colin

On Wed, Mar 2, 2011 at 2:34 PM, Colin L. [email protected]
wrote:

Good question… and rails gets it right:

ruby-1.9.2-p136 :004 > ‘xp_jurisdiction_taxes’.singularize
=> “xp_jurisdiction_tax”

I meant to output that during the test itself if possible, to make
sure that the inflections have been picked up at that time.

Good idea, sorry… so “puts ‘xp_jurisdiction_taxes’.singularize” while
inside a spec (cant put it directly inside the shoulda call though)
gives
us:

xp_jurisdiction_tax