2015-11-10 2 views
0

Я две следующие модели связаны:Active Record Получить belongs_to

class Post < ActiveRecord::Base 
    belongs_to :language 

    def self.are_visible 
    self.where(:visible => true) 
    end 
end 

class Language < ActiveRecord::Base 
    has_many :posts 
end 

schema.rb

create_table "languages", force: true do |t| 
    t.string "name_de" 
    t.string "name_en" 
end 

create_table "posts", force: true do |t| 
    t.string "title" 
    t.text  "description" 
    t.integer "language_id" 
end 

add_index "posts", ["language_id"], name: "index_posts_on_language_id" 

Как я могу перечислить все языки всех видимых магазинах без дублей?

Я хочу что-то вроде этого:

@languages = Post.are_visible.select(:language).uniq 

Но это приводит к следующей ошибке

PG::UndefinedColumn: ERROR: column "language" does not exist 

Конечно, этот столбец не существует, только столбец language_id существует на столе.

Я задаюсь вопросом, почему это настолько сложно, потому что в C# Linq я бы просто написать:

Repository.Posts.Where(p => p.Visible).Select(p => p.Language).Distinct() 

И я хотел бы получить все места соответствующих должностей. Но почему-то я думаю, что мне нужно изменить свой подход в корне, чтобы получить это в активной записи.

Update: Понял работает следующим образом:

@languages = Post.joins(:language).are_visible.uniq.pluck(:name_de) 
+0

Пожалуйста, измените текст вопроса, потому что это не очевидно. – MC2DX

+0

@ MateuszCzerwiński Обновленный вопрос будет более конкретным. – Dennis

+1

. Лучший подход - использование методов, а не методов класса. – MC2DX

ответ

0

Путь вы его настроить, у вас есть только один язык для одного почтового записи. У вас нет связанных с ними способ, которым вы можете это сделать с помощью ActiveRecord; однако вы можете получать сообщения по языку.

@posts = @language.posts

Это может иметь больше смысла иметь has and belongs to many relationship между этими моделями.

+0

В конце концов, я хочу, чтобы языки были возвращены, а не сообщения. – Dennis

+0

Да, поэтому я предлагаю изменить отношения. – Jerrod

0

Вы пытались с scope? Тогда вы должны быть в состоянии использовать select или получить языки видимых сообщений:

class Post < ActiveRecord::Base 
    belongs_to :language 
    scope -> :are_visible { where(visible: true) } 
end 

, конечно, если у вас есть столбец, видимый в таблице Post, которая принимает только логические значения.

Edit:

Постарайся добавить join:

@languages = Post.joins(:language).are_visible.select(:language).uniq 
+0

Я добавил 'are_visible' в класс Post. Но это не помогает для разрешения языка сообщения. – Dennis

+0

Да, потому что он возвращает только сообщения, которые видны, тогда вы получаете коллекцию сообщений, и их можно фильтровать по языку. Например, вы можете вызвать '# first' на нем и получить язык сообщения. – MC2DX

+0

SELECT DISTINCT language FROM "posts" INNER JOIN "languages" ON "languages". "Id" = "posts". "Language_id" WHERE "posts". "Visible" = 't' – Dennis

0

Хорошо, так что я не получил эту работу, поэтому я изменил свой подход немного.

@languages = Post.joins(:language).are_visible.uniq.pluck(:name_de) 
Смежные вопросы