2016-01-11 5 views
0

У меня есть следующие схемы Экты:запросов с внешними ключами в Экто Модели

schema "videos" do 
    field :name, :string 
    field :mpdName, :string 
    field :urlPlayready, :string, size: 500 
    field :urlWidevine, :string, size: 500 
    field :urlFile, :string, size: 500 
    field :custom_data, :string, size: 500 
    field :drm_today, :boolean 
    field :vote, :integer 
    has_many :user_videos, VideoBackend.UserVideos 
    has_many :users, through: [:user_videos, :user] 
    timestamps 
    end 


schema "users" do 
    field :name, :string 
    field :email, :string , [:primary_key] 
    field :encrypted_password, :string 
    field :password, :string, virtual: true 
    has_many :user_videos, VideoBackend.UserVideos 
    has_many :videos, through: [:user_videos, :video] 
    timestamps 
end 

schema "user_videos" do 
    belongs_to :users, VideoBackend.User 
    belongs_to :videos, VideoBackend.Video 
    field :time, :float 
    field :device, :integer 
    timestamps 
end 

Теперь я хочу, чтобы сделать запрос, выберите user_videos данные конкретный «пользователь» и конкретное «видео». В SQL я хотел бы написать этот простой запрос:

SELECT FROM user_videos WHERE user = "user" and video = "video"

Я попытался написать следующий экто запрос, но он не работает:

def single_userVideo(user,video) do 
    from u in UserVideos, 
    where: u.user == ^user and u.video == ^video 
end 

Вы знаете, как я мог бы решить эту проблему?

ответ

1

Если вы используете has_many и belongs_to, тогда вы, возможно, захотите запросить на основе столбцов _id.

Так SQL будет:

SELECT FROM user_videos WHERE user_id = "user" and video_id = "video"

И запрос:

def single_user_video(%{id: user_id}, %{id: video_id}) do 
    from u in UserVideos, 
    where: u.user_id == ^user_id, 
    where: u.video_id == ^video_id 
end 

Когда where/3 используется более чем один раз в запросе он будет использовать AND в запросе.

where expressions are used to filter the result set. If there is more than one where expression, they are combined with an and operator. All where expressions have to evaluate to a boolean value.

Как и в сторону, функции Elxir написаны в snake_case так single_userVideos должны быть single_user_videos

+0

Проблема заключается в том, что он бросает мне эту ошибку: «поле VideoBackend.UserVideos.user в котором не существует в исходнике модели в запросе: от u в VideoBackend.UserVideos, где: u.user ==^1, где: u.video ==^1 " Это происходит, потому что я не добавил« пользователь »и« видео » "в модели" user_videos "? –

+0

Вы должны использовать 'user_id' и' video_id', как я указал в ответе. – Gazler

+0

Спасибо. Это была проблема конвенции. В моем случае я должен использовать users_id и videos_id –

Смежные вопросы