Rails - Ассоциации - Автоматическая установка association_id для модели, которая имеет 2 own_to - PullRequest
1 голос
/ 12 апреля 2010

у меня 3 модели

class User < ...
  belongs_to :language
  has_many :posts
end

class Post < ...
  belongs_to :user
  belongs_to :language
end

class Language < ...
  has_many :users
  has_many :posts
end

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

@user.posts.create(:text => "blah", :language_id => @user.language_id)

Это хорошо, но способ, которым я устанавливаю язык, не устраивает меня. Язык всегда будет языком пользователей, поэтому есть ли лучший способ сделать это?

Я немного знаю о обратных вызовах и расширениях ассоциаций, но не уверен ни в каких подводных камнях.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2010

Да, есть способ «хорошей практики» с обратными вызовами.

class Post
  before_validation_on_create :set_language

  protected
  def set_language
    self.language ||= self.user.language if self.user
  end

end

Тогда вы можете

@user.posts.create(:text => "blah")

или

post.create(:text => "fewf")
1 голос
/ 12 апреля 2010

Я бы просто сделал create_post функцию в пользовательской модели:

def create_post(text)
  posts.create(:text => text, :language_id => language_id)
end

тогда просто звоните туда, куда вам нужно.

...