Writing to many_to_many table

I have three tables. users, posts, users_posts. This last one is to
mark a post as read.

How do I write to the users_post table?

Here’s what I have:

In model ‘User_Post’
belongs_to :post
belongs_to :user

In post/view/show:
<%= link_to “Mark As Read”, :controller => ‘post’, :action =>
‘post_read’,
:user => @user.id :post => @post.id %>

In post_controller:
def post_read
@postread = UserPost.new(params[:user :post])
if @postread.save
flash[:notice] = “Read”
end

//migration file:
create_table :posts_users do |t|
t.column :user_id, :integer
t.column :post_id, :integer
end

Join tables, by default, are expected to have the tables they join in
alpha order, hence posts_users rather than users_posts.

David C. wrote:

//migration file:
create_table :posts_users do |t|
t.column :user_id, :integer
t.column :post_id, :integer
end

Join tables, by default, are expected to have the tables they join in
alpha order, hence posts_users rather than users_posts.

Thanks, then what?

comfort eagle wrote:

David C. wrote:

//migration file:

Join tables …
Thanks, then what?
I thought you asked how to write the table, but now I see you asked how
to write TO the table. Sorry for answering the wrong question :slight_smile:

DHH talked about this in his keynote at RailsConf - the idea is that you
should think of PostUser (Posting?) as a first class citizen of your
domain, and give it its own model and controller. In your case you may
not need the controller, but if you give it a model you can do this in
your PostsController (validation excluded for brevity):

def create
@post = Post.new(params[:post])
@post.save
Posting.new(:user_id => params[:user_id], :post_id => @post.id).save
end

Cheers,
David

David C. wrote:

comfort eagle wrote:

David C. wrote:

//migration file:

Join tables …
Thanks, then what?
I thought you asked how to write the table, but now I see you asked how
to write TO the table. Sorry for answering the wrong question :slight_smile:

DHH talked about this in his keynote at RailsConf - the idea is that you
should think of PostUser (Posting?) as a first class citizen of your
domain, and give it its own model and controller. In your case you may
not need the controller, but if you give it a model you can do this in
your PostsController (validation excluded for brevity):

def create
@post = Post.new(params[:post])
@post.save
Posting.new(:user_id => params[:user_id], :post_id => @post.id).save
end

Cheers,
David

Instead of “Posting” I have a model for table posts_users “PostUser”.

So substituting this: “PostUser.new(:user_id => params[:user_id],
:post_id => @post.id).save” results in error:

“blog_development.post_users’ doesn’t exist”.

Notice the singular “post” and multiple “users” now for the table name
in the error msg.

Ideas?

Instead of “Posting” I have a model for table posts_users “PostUser”.

So substituting this: “PostUser.new(:user_id => params[:user_id],
:post_id => @post.id).save” results in error:

“blog_development.post_users’ doesn’t exist”.

Notice the singular “post” and multiple “users” now for the table name
in the error msg.

rename to postings and Posting :slight_smile:

The posts_users name is only relevant if you want the automagic of
has_and_belongs_to_many. If you don’t, and you have a first class join
model to link posts and users, I’d give it a better name.

I do want the magic though.

comfort eagle wrote:

Instead of “Posting” I have a model for table posts_users “PostUser”.

So substituting this: “PostUser.new(:user_id => params[:user_id],
:post_id => @post.id).save” results in error:

“blog_development.post_users’ doesn’t exist”.

Notice the singular “post” and multiple “users” now for the table name
in the error msg.

Ideas?

Yup, rename to postings and Posting :slight_smile:

The posts_users name is only relevant if you want the automagic of
has_and_belongs_to_many. If you don’t, and you have a first class join
model to link posts and users, I’d give it a better name.

Alan

You won’t get “the magic” because it’s not that kind of a join. If all
you
wanted was to map a user to a post, you could use “the magic” of
has_and_belongs_to_many. Since you want to store additional information
on
that linking table, you need to make that linking table a new model.
Then
you use has_many :through to make it work the way you want.

Here’s kinda what you want.

class Readings< ActiveRecord::Base
belongs_to :post
belongs_to :user
end
class Post< ActiveRecord::Base
has_many :readings, :dependent => :destroy
has_many :users, :through => :readgins
end
class User< ActiveRecord::Base
has_many :readings, :dependent => :destroy
has_many :posts, :through => :readings
end

See this for some insight:

http://blog.hasmanythrough.com/articles/2006/04/20/many-to-many-dance-off

@postread = PostUser.new(:user_id => params[:user_id], :post_id =>
params[:post_id]).save” ended up working in my action.

Maybe I’ll have more trouble getting that info out in a meaningful
manner though.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs