I'm trying to use Rails to peek into some WordPress (weblog) database, using ActiveRecord. Retrieving posts works elegantly, even without one single line of code. Unfortunately, I can't retrieve associated data correctly, for example getting the categories of a post.
The relevant WordPress tables and fields are:
Table: wp_posts id ...
Table: wp_categories cat_id cat_name ...
Table: wp_post2cat rel_id post_id category_id
wp_post2cat is a join table, linking posts to categories.
In my Rails app, I've set up the following models:
File: app/models/post.rb class Post < ActiveRecord::Base has_and_belongs_to_many :categories, :join_table => "wp_post2cat" end
File: app/models/category.rb class Category < ActiveRecord::Base set_primary_key "cat_id" has_and_belongs_to_many :posts, :join_table => "wp_post2cat" end
With this, a correct database.yml and the correct table prefix "wp_", I can correctly retrieve posts or categories: p = Post.find(4812) c = Category.find(10)
For now, trust me that post 4812 is associated to category 10. p.methods() shows that this object also has a method categories(), and c.methods() shows a posts() method.
The problem is that is isn't working: p.categories() results in
If I look to the resulting SQL-query, I see: SELECT * FROM wp_categories INNER JOIN wp_post2cat ON wp_categories.cat_id = wp_post2cat.category_id WHERE (wp_post2cat.post_id = NULL )
I assume that the problem is in the WHERE-clause: post_id shouldn't be tested against NULL. If I replace NULL with 4812, I get the correct Category record.
Could someone locate the error in my setup, or provide pointers for further experimentation?
Many thanks, kind regards,
Jochem