build method

@item=Item.new

@item.item_item_properties.build

@item.item_item_properties.count
=> 0

Why doesn’t my @item object have any item_item_properties after build method

Use .size instead of .count. “count” does a database query and since you only built the element the COUNT db query will return 0. “size” knows what to do if the association is already initialized so it will return “1” in your case (and if it’s not already loaded it will run a COUNT db query).

How do I reference individual columns?

2.3.3 :006 > @item.item_item_properties.item_property_id
NoMethodError: undefined method `item_property_id’ for #ItemItemProperty::ActiveRecord_Associations_CollectionProxy:0x0055d4167fd628

@item.item_item_properties returns a collection of objects, you are calling a method on something array-like, it makes no sense.

If you want to get all the item_property_ids you can do @item.item_item_properties.pluck(:item_property_id) for example. I’m not sure what you want to achieve.

Could I directly access key, value without pluck or otherwise like

@item.item_item_properties.each do |key, value|
item_property_id

You can do @item.item_item_properties.each do |item_item_property| and handle that object inside the loop, I’m not sure why would you expect that item_item_properties relationship to return key, value pairs. I don’t understand what you want to achieve, maybe you are trying to do it on the wrong path.

2.3.3 :006 > @item.item_item_properties.pluck(:item_property_id)
=> []

Display item_property attributes in form

If you have:
item has_many item_item_properties

item_item_property belongs_to item_property

then you can add a relationship on the item model

has_many :item_properties, through: :item_item_properties

Then you’ll be able to call @item.item_properties to loop through the ItemProperty objects associated to that Item object.

Now, you say @item.item_item_properties.pluck(:item_property_id) returns an empty array, that’s because the Item does not have associated properties and pluck does an SQL.

There are no database records yet, we know, the object was instantiated by the build method but so far I don’t see how to read it’s data for my views

You're trying to build a nested form, with the possibility of adding N children to the parent form. When you build a new child object in memory, you need to create a form for that object dynamically. There's a Railscast about this idea, which you may find useful: http://media.railscasts.com/assets/episodes/videos/196-nested-model-form-revised.mp4

Here's a link to the article about that screencast: http://railscasts.com/episodes/196-nested-model-form-revised

Please note that these videos are very old, and the specific details may differ from modern Rails practice, but the ideas underlying them are sound, and still hold up today.

Walter

def new
@item = Item.new(item_params)
ItemProperty.where(item_type: params[:item][:item_type]).each do |ip|
@item.item_item_properties.build(item_property_id: ip.id)
end

end

Then trying to reference @item.item_item_properties.item_property_id returns error:

NoMethodError: undefined method `item_property_id’ for #ItemItemProperty::ActiveRecord_Associations_CollectionProxy:0x0056269f53ab08