How to get all entries by user_id

In AR this is so simple

@articles = current_user.articles

How to do in Ecto?

def index(conn, _params) do
  current_user = conn.assigns.current_user
  meetings = Listings.list_meetings() #works..sure but I only want current_user ones..

Tried all what I could find in goo, but no success!

#meetings = Repo.get_by!(Meeting, user_id: current_user.id) #nope, but anyway …is this getting all or only one entry?
=> Enumerable not implemented for

meetings = Repo.all(Meeting) |> where(user_id: current_user.id)
=> MeetingController.init/1 is undefined.

some help would be great…thanks

Repo.all() will run the query you are passing to it, so you will want to compose the full query before passing it in. Your last example is close, try something like Meeting |> where(user_id: current_user.id) |> Repo.all()

The Repo.get_by! function retrieves a single match and will throw an error if there are multiple results, see (see Ecto.Repo.get_by!).

Alternatively to using Repo.all: if you have added a has_many field to your User schema, you can also use Ecto.assoc/2 (see Ecto.assoc for examples) to retrieve the meetings.

For a more in-depth discussion, you could always check out the Ecto Association Guide.

The Ecto guides are really great.
If you’re loading the user from scratch, and it has a has_many relationship you can also use preload. Like

User
|> preload(:meetings)
|> Repo.get(user_id)

When I do in schema meetings:
field :user_id, :integer
belongs_to :user, Accounts.User

I get: ** (ArgumentError) field/association :user_id is already set on schema…
So what? Do I have to set a relation in schema or not…This is all so unclear …

The field user_id (i.e. the field for the foreign key) will be automatically added when using belongs_to, so you should not add it yourself.

Should you need to customize the foreign key field name (say when you have two associations to the same schema), you can pass the foreign_key option to belongs_to (see belongs_to/3).

1 Like

It is difficult to change from AR to Ecto, it’s quite different.

But You might find a good free resource here

http://pages.plataformatec.com.br/ebook-whats-new-in-ecto-2-0

And this new book on Ecto

Ecto is closer to sql… here is a simple query

q = from m in Meeting, where: m.user_id == ^current_user.id
Repo.all(q)

You can also find an insightful talk of Darin Wilson on YouTube (kinda a preview to the book you mentioned): Thinking in Ecto

Thanks… finally it works…and thanks for the link…

Yes watched that…and I got the idea… But still new…

You can if you want to:

field :user_id, :id, primary_key: true

and on legacy databases you sometimes have to.

Ecto.Schema.field/3
Ecto.Migration.table/2
Ecto.Migration.add/3

It still won’t teach you SQL - you’re still on your own for that …

We’re also going assume that you’re comfortable working with relational databases and SQL. You don’t need to be an expert, but you should be familiar with tables, columns, indexes and how to write queries. There are many online tutorials that can walk you through the basics.

2 Likes

AR has a to_sql method, as long as You are fine with AR, You can generate SQL.

My favorite DB author to learn SQL, Joe Celko :slight_smile:

FYI: Ecto.Adapters.SQL.to_sql/3 which can also be used as Repo.to_sql(kind, queryable)

I mentionned AR because author of OP seems to be familiar with it.

Sure - however AR isn’t available in Ecto (or Phoenix) and I don’t know how much effort it would be to set up a piggybacked environment just for the purpose of generating SQL from active record.

Joe Celko’s stuff is interesting but from what I remember some of the content dealt with a “(prerelease-)reference-level ANSI SQL” that may or may not work on most platforms in the manner presented (so sometimes “translation” may be required). While SQL isn’t exactly moving at the same pace as JavaScript, a lot of his content has been around for awhile, the last (advanced) book update being from 2014.

For the purposes of getting the most out of Programming Ecto
http://www.postgresqltutorial.com/
is probably the best bet. The bits of the tutorial I have come across seem to do the job.

1 Like