Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails has_many relationship without using id

Have been messing around with Rails and while going through Hartl's tutorial I was asked to do a project. Figured it was a good opportunity to deviate off of the path, even though I don't know enough ;) Hence why I'm having a few problems.

I have two models:

Foo, which has parameter name and has_many FooStatus

FooStatus, which has parameters Foo.name and content, belongs_to Foo

Hartl's tutorial uses accounts that you log into, thus the @foo parameter is already bound and foo.id would be readily available for use. Once authenticated, a user can create a status for any Foo. In my HTTP request I am trying to send over foo.name and foostatus.content and have that information save to my DB.

My questions: Will these models store the appropriate relationship / link between the two objects in the db?

The line <% if @foo.foostatus.any? %> is giving me the error

SQLite3::SQLException: no such column: foostatus.foo_id: SELECT  1 AS one FROM "foostatus"  WHERE "foostatus"."foo_id" = ?  ORDER BY created_at DESC LIMIT 1

so I'm assuming that the .any? method is looking for foostatus.foo_id, which I don't store in my table.

I had originally thought that I could say

foo = Foo.find_by_name(params[:name]) 
@foostatus = foo.foostatus.build(params[:content])

but reading about Strong Parameters threw me in a circle, in that this wouldn't be allowed.

like image 605
user1870954 Avatar asked Jan 30 '14 20:01

user1870954


1 Answers

You can specify which columns are to be used as foreign and primary key for association:

class Foo < ActiveRecord::Base
  has_many :foo_statuses, foreign_key: :foo_name, primary_key: :name
end

class FooStatus < ActiveReocrd::Base
  belongs_to :foo, foreign_key: :foo_name, primary_key: :name
end
like image 154
BroiSatse Avatar answered Sep 20 '22 11:09

BroiSatse