2017-11-07 9 views
0

일대 다 관계로 항목을 검색하고 인쇄하려고합니다 (이 경우에는 주석이 모두있는 기사를 인쇄하려고합니다), elixir/ecto.Elixir/Ecto가 외래 키를 모델에서 인식하지 못합니다.

나는 다음과 같은 오류가 무엇입니까 -

[error] GenServer #PID<0.398.0> terminating 
** (Ecto.QueryError) deps/ecto/lib/ecto/association.ex:516: field `articles_id` in `where` does not exist in schema Newsly.Comments in query: 

from c in Newsly.Comments, 
    where: c.articles_id == ^1, 
    order_by: [asc: c.articles_id], 
    select: {c.articles_id, c} 

    (elixir) lib/enum.ex:1826: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (elixir) lib/enum.ex:1372: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3 
    (elixir) lib/enum.ex:1826: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (ecto) lib/ecto/repo/queryable.ex:124: Ecto.Repo.Queryable.execute/5 
    (ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4 
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2 
Last message: %Phoenix.Socket.Message{event: "addComment", join_ref: "43", payload: %{"articleid" => 1, "message" => "asdfasdfsasdfasdferqweasdfas", "user" => "peter"}, ref: "45", topic: "room:lobby"} 
State: %Phoenix.Socket{assigns: %{}, channel: Newsly.RoomChannel, channel_pid: #PID<0.398.0>, endpoint: Newsly.Endpoint, handler: Newsly.UserSocket, id: nil, join_ref: "43", joined: true, private: %{log_handle_in: :debug, log_join: :info}, pubsub_server: Newsly.PubSub, ref: nil, serializer: Phoenix.Transports.V2.WebSocketSerializer, topic: "room:lobby", transport: Phoenix.Transports.WebSocket, transport_name: :websocket, transport_pid: #PID<0.389.0>, vsn: "2.0.0"} 

무엇이 오류에 대한 이상한 것은 그것이 articles_id를 찾을 수 없다는 것입니다,하지만 내가 코멘트의 프리로드를 할 때 나는 article_id를 호출하고, 그리고 전역 내 코드의 나머지 부분. 여기

내가 가지고있는 포스트 그레스 데이터베이스 협회

defmodule Newsly.Comments do 
    use Newsly.Web, :model 

    schema "comment" do 
    field :body, :string 
    field :user, :string 
    field :upvotes, :integer 
    field :downvotes, :integer 
    field :flaggedcount, :integer 
    belongs_to :article, Newsly.Articles, foreign_key: :article_id #I don't call articles_id here!!! only article_id (singular). Ecto is seeing in the database a relationship that does not exist! 

    timestamps() 
    end 

    @doc """ 
    Builds a changeset based on the `struct` and `params`. 
    """ 
    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:body, :user, :upvotes, :downvotes, :flaggedcount]) 
    |> validate_required([:body, :user, :upvotes, :downvotes, :flaggedcount]) 
    end 
end 

그냥 번 확인하는 .... - 나는 리포 여기

defmodule Newsly.CommentController do 
    alias Newsly.{Repo, Articles, Comments} 

    def addComment(articleid, message, user) do 
    IO.puts "inside addComment() in CommentController" 

    article = Repo.get(Articles, articleid) 
    |> Repo.preload(:comments) #this line is giving the error - when I take it out the error goes away (although comments are not preloaded) 


    IO.puts "article" 
    IO.inspect article 

    end 
end 

를 호출 할 경우 다음

내 모델입니다 로컬 - article_id가 있음을 알립니다 (articles_id 아님)

newsly_dev=# table comment; 
id | body | user | upvotes | downvotes | flaggedcount | article_id | inserted_at | updated_at 
----+------+------+---------+-----------+--------------+------------+-------------+------------ 
(0 rows) 

전 완전히 잃었습니다. 누구든지 아이디어가 있습니까?

+0

'Articles' 모델의'has_many'에 대해 올바른 foreign_key가 설정되어 있습니까? – Dogbert

+0

그게 ..... 그랬지. –

답변

2

기사를 처음으로 가져 와서 주석을 가져 오는 경우 Ecto는 has_many 선언을 Articles 모델로 사용하므로 사용자 정의 foreign_key이 누락 될 가능성이 큽니다.

has_many :comments, Newsly.Comments, foreign_key: :article_id 
            ^^^^^^^^^^^^^^^^^^^^^^^^