1

私は次のモデルを持っています:

class Post < ActiveRecord::Base
    has_and_belongs_to_many :countries
end

class User < ActiveRecord::Base 
    has_many :entitlements
    has_many :countries, :through => :entitlements
end

投稿インデックス ページの投稿には、ユーザーの国と同じ国が少なくとも 1 つ含まれている必要があります。

モデルと長いコントローラー コードでさまざまなスコープを試しましたが、単純な関係を確認する方法がわかりません。つまり、Post.countries の少なくとも 1 つの項目が User.countries に存在するかどうかです。

どんな助けも大いに受けました。

更新しました:

わかりましたので、コントローラーに次のものがあります。

  def index
    @user = current_user
    @user.countries.each do |user_country|  
       @user_country_posts += Country.find(user_country.id).posts
    end
    @posts = @user_country_posts
  end

user.countries を繰り返し処理し、それらの国の各投稿を見つけます。しかし、実行すると次のようになります。

NoMethodError: undefined method `+' for nil:NilClass

私が間違っていることはありますか?

4

2 に答える 2

2

問題は、以前に定義されていなかったインスタンス変数を使用しようとしている@user_country_postsため、その値がnil.

行で:

@user_country_posts += Country.find(user_country.id).posts

実際に+は、変数でメソッドを呼び出してい@user_country_postsます。これは+nil.

次のように、メソッドの先頭で変数を初期化してみてください。

@user_country_posts = []
于 2012-10-29T23:35:55.050 に答える
0

Ruby のユニオン アプローチの使用も検討します。

[1,2,4] & [1,4,5]
=> [1,4]

したがって、ユーザーの国のリストと投稿国のリストがある場合は、以下が機能する可能性があります。

@shared_country_ids = @user.countries.map(&:id) & @post.countries(&:id)

上記の更新から、ユーザーの国コードのいずれかを持つすべての投稿を表示したいと思われます。その場合、私は以下を行います:すなわち:

@posts = Post.where(:countries => @user.countries)

上記は、関係を正しく構成したと仮定して機能するはずです。

于 2012-10-29T23:51:32.813 に答える