Help with associations

I’m new to RoR and databases in general. Here is my problem.

I have “Lists” and “Items”. Instead of using a join table and a habtm
relationship, I created a third model so I can hold additional data in
it. It’s called “Listitems”. I want to be able to display only the
“Items” that have not yet been added to the certain “List”.

I have:

class List < ActiveRecord::Base
has_many :listitems, :dependent => true
has_many :items, :through => :listitems
end

class Item < ActiveRecord::Base
has_many :listitems, :dependent => true
has_many :lists, :through => :listitems
end

class Listitem < ActiveRecord::Base
belongs_to :list
belongs_to :item
end

What kind of query should I be writing in my controller to get the
results I want.

Untested, but I think that should do it:

class List
OTHER_ITEMS_SQL = <<-EOF
select * from items
where not exists
(select * from list_items.item_id = items.id and
list_items.list_id = ?)
EOF
# Get all items that do NOT belong to this list.
def other_items
Item.find_by_sql [OTHER_ITEMS_SQL, self.id]
end
end

Hoolio wrote:

I’m new to RoR and databases in general. Here is my problem.

I have “Lists” and “Items”. Instead of using a join table and a habtm
relationship, I created a third model so I can hold additional data in
it. It’s called “Listitems”. I want to be able to display only the
“Items” that have not yet been added to the certain “List”.

I have:

class List < ActiveRecord::Base
has_many :listitems, :dependent => true
has_many :items, :through => :listitems
end

class Item < ActiveRecord::Base
has_many :listitems, :dependent => true
has_many :lists, :through => :listitems
end

class Listitem < ActiveRecord::Base
belongs_to :list
belongs_to :item
end

What kind of query should I be writing in my controller to get the
results I want.

Let me encourage you to go “fat model, skinny controller” and write that
query in the model’s class instead. Just call that method from the
controller. You’ll thank yourself later. Also, if I were doing it, I’d
name your join model “Listing”, which falls more trippingly from the
tongue than “ListItem”.

As for the query, I show how to do that sort of thing here:
http://blog.hasmanythrough.com/2006/9/9/finding-unassociated-objects


Josh S.
http://blog.hasmanythrough.com

I think I’m still misunderstanding. I read the blogpost and tried
doing:

class List < ActiveRecord::Base
has_many :items, :through => :listitems do
def not
find(:conditions => [“items.id != ?”, proxy_owner.id])
end
end
end

I then try looping through

<% for item in @list.items.not %>
<% item.name %>
<% end%>

I get the error “Couldn’t find Item without an ID”

On Nov 17, 10:51 am, Josh S. [email protected]

I ended up using in my view:

<% for item in @items %>
<% unless @list.items.include?(item) %>
[CODE] etc etc etc

It’s messy, but it seems to work